2011-09-26 64 views
0

我有一個典型的嵌套樹模型,我想根據水平或深度構建一個包含'children'數組的數組,但它似乎不適合我。這是我現在有:PHP構建數組遍歷嵌套樹模型

while($this->tax->getTreeNext($nodes)) 
{ 

    $level = $this->tax->getTreeLevel($nodes); 

    if($level != 0){ 
     echo $level . '-' . $current_level; 
     if($level > $current_level){ 
      $terms[$i] = array(
        'term_id' => $terms[$i-1]['term_id'], 
        'name' => $terms[$i-1]['name'], 
        'level' => $terms[$i-1]['level'], 
         'children' => array(
         'term_id' => $nodes['row']['term_id'], 
         'name'  => $nodes['row']['name'], 
         'level'  => $level,    
         ) 
       ); 

      unset($terms[$i-1]); 
     }else{ 

      $terms[$i] = array(
       'term_id' => $nodes['row']['term_id'], 
       'name'  => $nodes['row']['name'], 
       'level'  => $level 
      ); 
     } 

     $current_level = $level; 
     $i++; 
    } 
} 

這適用於一個孩子,但如果孩子有孩子......任何建議,就如何解決這一問題?

謝謝!

編輯:

這是一個似乎是接近的工作最新:

function process(&$arr, &$prev_sub = null, $cur_depth = 1) { 

    $cur_sub = array(); 
    while($line = current($arr)){ 
     if($line['depth'] < $cur_depth){ 
      return $cur_sub; 
     }elseif($line['depth'] > $cur_depth){ 


      $prev_sub = $this->process($arr, $cur_sub, $cur_depth + 1); 

     }else{ 

      $cur_sub[$line['term_id']] = array('term_id' => $line['term_id'], 'name' => $line['name']); 
      $prev_sub =& $cur_sub[$line['term_id']]; 
      next($arr); 
     } 
    } 
    return $cur_sub; 
} 

樹傳入該關聯每個節點的深度值。目前的問題是elseif($line['depth'] > $cur_depth)。如果一個節點有子節點,它只會爲子節點返回數組,但它不包含節點名稱或term_id。

謝謝!

+3

遞歸而不是迭代。 – usoban

+0

不太確定我明白了......你能舉一個例子嗎? – dzm

+0

你能否詳述一下你的數據結構?你的樹是如何定義和存儲的? –

回答

1

由於我沒有真正瞭解您當前的數據結構是什麼樣子,請查看遍歷樹的這個微不足道的示例。

$treeRoot = $this->tax->getRoot(); 

$result = traverse($treeRoot, 0); 

function traverse($root, $level){ 
$arr = array(); 

$arr['term_id'] = $root['row']['term_id']; 
$arr['name'] = $root['row']['name']; 
$arr['level'] = $level; 

while($child = $root->getNextChild()){ 
    $arr['children'][] = traverse($child, $level+1); 
} 

return $arr; 
} 

所以你從樹根開始,填充數組的第一級。然後,你繼續與根的孩子,但你更深入一層。你做的事情和根源完全一樣,你填寫數據並去找孩子的孩子。當你到達樹的底部時,最後一個(grandgrandgrand)孩子發現它沒有剩下孩子,所以它只是將自己(普通數組)返回給它的父親。該父母將自己返回到其父母,等等,直到您再次到達根。你有自己的嵌套數組。通常情況下,您會將這種結構作爲樹來使用,但由於我不知道您希望得到的結果是什麼(您沒有提供任何示例),請使用上面的代碼作爲您自己實現的參考。

+0

謝謝..這似乎完全正確,它給了我一個無盡的循環雖然..不知道 – dzm

+0

嗯,奇怪。 while()應該在最低級別停止它,因爲葉子沒有任何孩子,所以循環不應該被執行。嘗試調試並找出它在哪裏循環,並更新問題,我會研究它。 – usoban

+0

謝謝,我已將問題更新至最新版本 – dzm