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