2011-09-26 62 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