プロパティparent
は、現在のアイテム (またはnull
) の親を返します。それ自体が親であるアイテムでの無限再帰を避ける必要があります。
// An item is considered without parent if parent is null or itself
$item1 = new Item();
$item1->setParent($item1);
$item2 = new Item();
$item2->setParent($item1);
$item3 = new Item();
$item3->setParent($item2);
$item1->getAncestors(); // Empty
$item2->getAncestors(); // Item 1
$item2->getAncestors(); // Item 1, Item 2
次の例は、最初の条件がtrue
「問題あり」であるため機能し$item
ません (したがって、2 番目の条件は評価されません)。
/**
* Gets all ancestors of this item, sorted in a way that the farthest ancestor
* comes first.
*
* @return \Doctrine\Common\Collections\ArrayCollection
*/
public function getAncestors()
{
$parent = $this;
$ancestors = array();
while ($parent = $parent->parent && $this !== $parent) {
$ancestors[] = $parent;
}
return new ArrayCollection(array_reverse($ancestors));
}
$this
ループ1は$parent
次のとおりであるため、これも機能しません。
while ($this !== $parent && $parent = $parent->parent) {
$ancestors[] = $parent;
}
これはよくある問題だと思いますが、自分で解決策を見つけることができません。