2017-06-19 19 views
1

下面列出了PHP PDO中mySQL查詢的輸出。該對象包含兩個表中的多個列,然後將這些列合併爲一個對象。當對象鍵未知但在對象中已知子鍵時分配PHP對象

在同一個表中的某些行是別人的孩子所確定的列parent_ID。然後這些孩子需要像他們的孩子一樣被添加到父母的對象中,等等。

雖然我能做到這一點只是爲了孩子的前兩個層次,我不能明白的方式,而不進行其他的foreach以外第一個實現此對象的層。未在第三行有一個

foreach($components as $component){ 
    if($component->parent_ID < 0){ 
     $output->{$component->ID} = $component; 
    } 
    else if($output->{$content->parent_ID}){ 
     $output->{$content->parent_ID}->child->{$component->ID} = $component; 
    } 
    else if($output->?->child->{$conent->parent_ID}){ 
     $output->?->child->{$content->parent_ID}->child->{$component->ID} = $component; 
    } 
    } 

這個例子應該添加清晰度上述?通常會有一個ID。這是因爲我們現在不知道該ID是什麼。在第一層我們做了,因爲它是parent_ID,但是這一行正在處理父母孩子的孩子。

+0

我得到你的權利,你有一棵樹? – Rulisp

+0

@Rulisp這是技術術語嗎? –

+0

https://en.wikipedia.org/wiki/Tree_(data_structure) – Rulisp

回答

1

所以,我到目前爲止,我從評論的理解和假設你沒有很多的數據庫記錄,它在我看來,最好的辦法是預先加載從數據庫中的所有行,然後使用此功能構建樹

public function buildTree(array &$objects) { 
     /** thanks to tz-lom */ 
     $index = array(); 
     $relations = array(); 

     foreach($objects as $key => $object) { 
      $index[$object->getId()] = $object->setChildren(array()); 


      $relations[$object->getParentId()][] = $object; 


      if ($object->getParentId()) { 
       unset($objects[$key]); 
      } 
     } 

     foreach ($relations as $parent => $children) { 
      foreach ($children as $_children) { 
       if ($parent && isset($index[$parent])) { 
        $index[$parent]->addChildren($_children->setParent($index[$parent])); 

       } 
      } 
     } 
     return $this; 
    } 

PS真的,我沒有看到其他方式沒有foreachforeach。至少,它不是遞歸的

+0

我會試一試。謝謝 –

+0

也遞歸函數非常適合樹狀結構 – Kazz

+0

@Kazz謝謝您的評論。在第一個函數中有一個註釋,我用工作代碼(意外)刪除了。代碼固定 – Rulisp