PHP中简单的递归对象层次结构,如何避免无限循环?

PHP中简单的递归对象层次结构,如何避免无限循环?,php,recursion,hierarchy,php-5.3,hierarchical,Php,Recursion,Hierarchy,Php 5.3,Hierarchical,属性parent返回当前项的父项(或null)。我需要避免一个项本身是父项的无限递归 //如果父项为null或其本身,则认为该项没有父项 $item1=新项目(); $item1->setParent($item1); $item2=新项目(); $item2->setParent($item1); $item3=新项目(); $item3->setParent($item2); $item1->get祖先();//空的 $item2->getOrients();//项目1 $item2->ge

属性
parent
返回当前项的父项(或
null
)。我需要避免一个项本身是父项的无限递归

//如果父项为null或其本身,则认为该项没有父项
$item1=新项目();
$item1->setParent($item1);
$item2=新项目();
$item2->setParent($item1);
$item3=新项目();
$item3->setParent($item2);
$item1->get祖先();//空的
$item2->getOrients();//项目1
$item2->getOrients();//项目1、项目2
以下条件不起作用,因为对于“有问题的”
$item
,第一个条件为
true
(因此第二个条件不被计算):

/**
*获取此项的所有祖先,按最远的祖先
*第一位。
*
*@return\doctor\Common\Collections\ArrayCollection
*/
公共函数
{
$parent=$this;
$ANCENTS=array();
而($parent=$parent->parent&&$this!=$parent){
$祖先[]=$parent;
}
返回新的ArrayCollection(array_reverse($祖先));
}
这也不起作用,因为在循环1上,
$This
$parent

while($this!==$parent&&$parent=$parent->parent){
$祖先[]=$parent;
}

我确信这是一个常见的问题,但我自己找不到解决方案。

正如您所说的,您正在遍历的结构不是一棵树。这是一个带圈的有向图。避免无限循环的一种方法是通过传递包含所有访问顶点的arraylist来跟踪访问的顶点。访问每个顶点时,首先检查它是否在列表中,如果为true,则返回,否则将其添加到列表中并继续。您不需要递归。一个while循环就可以了。

一个孩子不能有多个父母,因此是一棵树,不是吗?不,这不是一个充分条件。你不应该有任何周期。有关树的正式定义,请参阅和相关链接。“树数据结构可以递归(本地)定义为一组节点(从根节点开始),其中每个节点都是一个数据结构,包括一个值以及一系列对节点的引用(“子节点”)(维基百科)对下一个投票人说:有礼貌地留下一条评论来解释。我投了反对票,因为即使你是正确的,这也不是一个密码答案。这是一个维基百科链接。