private function find_children ($parent_id, $children, &$result)
{
foreach ($children as $c)
{
if ($c->parent_comment_id == $parent_id)
{
$result[] = $c;
$this->find_children($c->id, $children, $result);
}
}
return;
}
上面的函数应该采用一个起始父id并递归地遍历一个子节点数组(实际上只是一个具有唯一id和父id的对象)对它们进行排序,以便每个节点直接在它的父节点之后(参见以下是样本数据)。
但由于某种原因,该功能没有像我预期的那样执行。我有以下数据供测试。
id: 1 pid: 0 (the initial parent which is not in the children array passed to func. problem?)
id: 2 pid: 1
id: 3 pid: 2
id: 4 pid: 1
id: 5 pid: 3
id: 6 pid: 5
id: 7 pid: 4
id: 8 pid: 3
并希望返回以下数组: 1,4,7,2,3,8,5,6
但相反,我得到: 1,2,3,5,6
虽然它们的顺序正确,却有一些缺失。
多年来我没有必要做递归,所以很可能我错过了一些明显的东西,尽管对我自己并不那么明显。
如果有人想知道,或者是否重要,我正在尝试建立一个q&评论系统,其中每个帖子都可以有多个回复。
因此:
initial post
-reply to initial post #1
--reply to reply
-reply to initial post #2
-- reply to above
--- reply to above
--reply to #2
答案 0 :(得分:1)
答案 1 :(得分:1)
当我对你列出的数据运行你的功能时,我确实收到你描述的订单,但我没有遗漏任何物品:
id: 1, pid:0
id: 2, pid:1
id: 3, pid:2
id: 5, pid:3
id: 6, pid:5
id: 8, pid:3
id: 4, pid:1
id: 7, pid:4
这个结果实际上是你想要的树结构,只是按id的顺序排序。如果你按照id的顺序命令chhildren-array,那么你实际上得到了你要求的输出:
id: 1, pid:0
id: 4, pid:1
id: 7, pid:4
id: 2, pid:1
id: 3, pid:2
id: 8, pid:3
id: 5, pid:3
id: 6, pid:5
您应该确保从数据库中按降序获取数据。对于这个非DB测试用例,我在调用find_children()之前使用以下命令修复它:
function revCmpObjects($a, $b) { //Just a basic descending ordering by the id
if ($a->id == $b->id) {
return 0;
}
return ($a->id > $b->id) ? -1 : 1;
}
usort($children, 'revCmpObjects'); //The actual sorting