Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP通过遍历嵌套树模型构建数组_Php_Mysql_Arrays_Multidimensional Array - Fatal编程技术网

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

PHP通过遍历嵌套树模型构建数组,php,mysql,arrays,multidimensional-array,Php,Mysql,Arrays,Multidimensional Array,我有一个典型的嵌套树模型,我想根据级别或深度构建一个带有“子”数组的数组,但它似乎不适合我。以下是我现在拥有的: while($this->tax->getTreeNext($nodes)) { $level = $this->tax->getTreeLevel($nodes); if($level != 0){ echo $level . '-' . $current_level; if($level > $c

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

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;
 }
函数过程(&$arr,&$prev\u sub=null,$cur\u depth=1){
$cur_sub=array();
而($line=当前($arr)){
如果($line['depth']<$cur\u depth){
返回$cur_sub;
}elseif($line['depth']>$cur_depth){
$prev\u sub=$this->process($arr、$cur\u sub、$cur\u depth+1);
}否则{
$cur_sub[$line['term_id']]=array('term_id'=>$line['term_id'],'name'=>$line['name']);
$prev_sub=&$cur_sub[$line['term_id'];
其次($arr);
}
}
返回$cur_sub;
}
该树通过与每个节点关联的深度值传递到此节点。当前的问题在于
elseif($line['depth']>$cur\u depth)
。如果节点有子节点,它只返回子节点的数组,但不包括该节点的名称或术语\ id


谢谢大家!

由于我不太了解您当前的数据结构是什么样子,请看一下这个遍历树的简单示例

$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;
}
因此,从树根开始,填充数组的第一级。然后你继续根的孩子,但你更深入一层。您所做的操作与根完全相同,您填写数据并转到儿童的儿童。当您到达树的底部时,最后一个(grandgrand)子级发现它已经没有子级了,所以它只是将自己(普通数组)返回到其父级。该父对象将自身返回到其父对象,依此类推,直到您再次到达根对象


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

递归而不是迭代。我不太确定我得到了它。。。你能举个例子吗?你能详细说明一下你的数据结构吗?您的树是如何定义和存储的?它使用两列lft和rgt,据我所知,这几乎是一个标准的嵌套集。谢谢。。这似乎完全正确,但它给了我一个无止境的循环。。不确定,嗯,奇怪。while()应该在最低级别停止它,因为leaf没有任何子级,所以循环甚至不应该执行。试着调试,找出它循环的地方,然后更新问题,我会研究它。