2012-06-14 44 views
0

我有,我有孩子的父母,子女,孩子,孩子的孩子兒童等等等等填充數組。然而,我似乎無法弄清楚如何在不需要編寫每個關卡的情況下儘可能多地創建關卡。PHP Array添加無論兒童?

首先現在我有

foreach($this->tree as $k=>$v) { 
    if($v['id'] == $i['pid']) { 
     // Add children 
     $this->tree[$k]['children'][] = array('name'=>$i['name'],'id'=>$i['id']); 
     break; 
    }else{ 
     foreach($v['children'] as $kc=>$vc) { 
     $this->tree[$k]['children'][$kc]['children'][] = array('name'=>$i['name'],'id'=>$i['id']); 
     } 
    } 
} 

產生的東西,看起來像

Array 
(
    [0] => Array 
     (
      [name] => Test 
      [id] => 1 
      [children] => Array 
       (
        [0] => Array 
         (
          [name] => Test2 
          [id] => 2 
          [children] => Array 
           (
            [0] => Array 
             (
              [name] => Test 3 
              [id] => 3 
             ) 

           ) 

         ) 

       ) 

     ) 

); 

但我似乎無法弄清楚如何做的是沒有寫出一個十億foreach循環。

$ i就是一個四行,ID,PID(父ID),名稱和重量。

+0

[遞歸函數的可能的複製產生從數據庫結果多維數組](http://stackoverflow.com/questions/8587341/recursive-function-to-generate-multidimensional-array-from-database-result)。遞歸,weeee〜! – deceze

+0

'$ i'是怎麼樣的? – SuperSaiyan

+1

通常對於那樣的樹結構,您將需要使用遞歸函數。 – robbrit

回答

1

正如其他人所說,這是很好的瞭解遍歷樹遞歸函數。

爲了讓你開始遞歸函數:

function walkRecursive($element) { 
    if($element['id'] == $i['pid']) { 
     // add your stuff 
     break; 
    } 
    if(isset($element['children'])) { 
     foreach($element['children'] as $child) { 
      walkRecursive($child); 
     } 
    } 
} 

walkRecursive($this->tree); 

或者,你想看看標準的PHP函數array_walk_recursive

http://php.net/manual/en/function.array-walk-recursive.php

0

你需要一個遞歸函數來實現這一目標。也就是說,一個函數或類方法遍歷項目的扁平列表中的每個項目並組裝一個新的多維列表,在自身內部調用自己以添加子項,然後添加子項的子項,等等聽起來令人困惑?如果您搜索它,在線有很多文檔。