在php中创建递归树失败

在php中创建递归树失败,php,tree,Php,Tree,现在,经过一天的研究和重构,我快发疯了 它简单得像F*,但我找不到错误 我使用递归函数从低到高从sql sortet获得一个简单的Id->ParentId结构。这很有效。现在,我想把它粘贴到html。html打印已准备就绪,并且正在工作。唯一的问题是: 我的“buildTree”功能不起作用。。我得到了所有的入口,但不是树。。。。有了print_r($tree),我可以看到,它们不再是维度了 我从数据库中获取的对象: Id ParentProcessId 16 NULL 17

现在,经过一天的研究和重构,我快发疯了

它简单得像F*,但我找不到错误

我使用递归函数从低到高从sql sortet获得一个简单的Id->ParentId结构。这很有效。现在,我想把它粘贴到html。html打印已准备就绪,并且正在工作。唯一的问题是: 我的“buildTree”功能不起作用。。我得到了所有的入口,但不是树。。。。有了print_r($tree),我可以看到,它们不再是维度了

我从数据库中获取的对象:

Id      ParentProcessId
16      NULL
17      16
18      17
19      17
20      18
21      20
守则:

    private function createTree(&$list, $parent = array()){
    $tree = array();
    foreach ($list as $k=>$l){
        if(isset($list[$l->Id])){
            $l->Children = $this->createTree($list, $list[$l->Id]);
        }
        $tree[] = $l;
    }

    return $tree;
}

您说您确实在$tree中得到了所有条目,这意味着由于某种原因,
isset($list[$l->Id])
永远都不是真的。我猜$list是一个从零开始的数组,看起来像这样:

$list => [
   0 => [ Id => 16, ParentProcessId => NULL],
   1 => [ Id => 17, ParentProcessId => 16],
   (...)
]
当处理
isset($list[$l->Id])
第一个条目时,会查找$list中不存在的第16个条目。我认为不需要这张支票。相反,我们应该检查所选项目是否是当前父项的子项(使用$parent,顺便说一句,代码中未使用该$parent),然后将其添加到树中

我认为这可能有效,但可能有一种更有效的方法:

private function createTree(&$list, $parent = array()){
    $tree = array();
    foreach ($list as $k=>$l){
        if((!isset($parent->Id) && !isset($l->ParentProcessId)) 
         || $l->ParentProcessId == $parent->Id){
            $l->Children = $this->createTree($list, $list[$l->Id]);
            $tree[] = $l;
        }
    }

    return $tree;
}

您是否尝试将函数公开?初始值
$list
看起来如何?@MichalJ.Figurski为什么公开?那里不需要它。