2016-06-06 48 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); 

希望你現在做你的功課,其實研究這個問題,所以也許你足夠幸運地遇到這個答案。