2016-06-06 49 views
0

如何创建一个递归类函数来跟踪相关对象之间的路径?如何递归获取相关对象之间的路径?

数据:

ID Name   ParentID 

1 Egypt   0 

2 USA   0 

3 Giza   1 

4 6th october 3 

函数调用,如addressPath(4)应该产生这样的输出:

Egypt-> Giza-> 10月6日


今天有人发帖一个简洁的家庭作业问题,没有显示任何r esearch的努力,而且它有无数的downvotes。最近我被鼓励回答这种类型的问题,因为this answer,我发现一些合理的享受和锐化技巧(想想code kata)。但是,在发布我的答案之前,该帖子已被删除,可能是因为peer pressure。无论如何,这是从我最美好的回忆中再现的问题。

回答

0

我认为一些混淆可能来自对象和对象集合之间的区别。为了这个可能的解决方案,我为每个类使用了一个类,以便函数可以属于集合类。

递归函数本身是逐行注释的,所以我希望它很清楚。

<?php 

class related_object { 

    public $ID; 
    public $Name; 
    public $ParentID; 

    public function __construct($id, $name, $parent=0) { 
    $this->ID = $id; 
    $this->Name = $name; 
    $this->ParentID = $parent; 
    } 

} 

class related_object_library { 

    public $objects; 

    public function add($object) { 
    $this->objects []= $object; 
    } 

    public function addressPath($id, $path='') { 

    // iterate through each object in collection 
    foreach ($this->objects as $object){ 

     // if ID matches, then return Name 
     if ($object->ID === $id) { 
     $path = $object->Name.$path; 

     // if it has a parent, then recurse, else just return 
     if (!empty($object->ParentID)) 
      return $this->addressPath($object->ParentID,"->$path"); 
     else return $path; 

     } // end if match 

    } // end loop 

    } // end function 

} // end class 

$collection = new related_object_library(); 

$collection->add(new related_object(1,'Egypt')); 
$collection->add(new related_object(2,'USA')); 
$collection->add(new related_object(3,'Giza',1)); 
$collection->add(new related_object(4,'6th october',3)); 

echo $collection->addressPath(4); 

希望你现在做你的功课,其实研究这个问题,所以也许你足够幸运地遇到这个答案。