PHP从遍历嵌套树模型构建数组

Posted

技术标签:

【中文标题】PHP从遍历嵌套树模型构建数组【英文标题】:PHP Building array from traversing a nested tree model 【发布时间】:2011-09-26 18:31:58 【问题描述】:

我有一个典型的嵌套树模型,我想根据级别或深度构建一个带有“子”数组的数组,但它似乎不适合我。这是我现在拥有的:

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'] &gt; $cur_depth)。如果一个节点有子节点,它只返回子节点的数组,但不包括该节点的名称或 term_id。

谢谢!

【问题讨论】:

递归而不是迭代。 不太确定我明白了...你能举个例子吗? 您能详细说明一下您的数据结构吗?您的树是如何定义和存储的? 它使用两列 lft 和 rgt,据我所知,这几乎是一个标准的嵌套集 【参考方案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;

所以你从树根开始,填充第一级数组。然后你继续使用 root 的孩子,但你会更深一层。您执行与根完全相同的操作,填写数据并转到孩子的孩子。当你到达树的底部时,最后一个(grandgrandgrand)孩子发现它没有孩子了,所以它只是将自己(普通数组)返回给它的父母。该父级将自己返回到其父级,依此类推,直到您再次到达根。

瞧,你已经得到了一个嵌套数组。通常,您会将这种结构保留为树,但由于我不知道您希望您的结果究竟是什么(您没有提供示例),请使用上面的代码作为您自己实现的参考。

【讨论】:

谢谢..这似乎完全正确,但它给了我一个无限循环..不确定 嗯,奇怪。 while() 应该在最低级别停止它,因为叶子没有任何子节点,因此甚至不应该执行循环。尝试调试并找出它在哪里循环,并更新问题,我会调查它。

以上是关于PHP从遍历嵌套树模型构建数组的主要内容,如果未能解决你的问题,请参考以下文章

遍历嵌套的 json 数组正在将先前分配的值添加到数据模型

PHP遍历函数将单个数组转换为带有子元素的嵌套数组 - 基于父ID

php foreach 嵌套循环大数组很慢?

PHP 递归遍历Cakephp线程数组(树行为)

二叉树构建与遍历-LeetCode 103108109(二叉树的构建,层次遍历)

急! jquery $.each 嵌套循环遍历