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