php中的递归函数未按预期工作

时间:2009-11-19 18:21:46

标签: php recursion

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

2 个答案:

答案 0 :(得分:1)

我认为你正在寻找像嵌套树一样的东西?

检查出来:

http://www.edutech.ch/contribution/nstrees/index.php

它应该做你想要的。

答案 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