[英]php recursive function through hierarchy doesn't come back out a level
嘗試創建對象數組的層次結構,但是遞歸函數失敗。 經過仔細檢查,它似乎更深地進入了樹中,但是一旦它用完了孩子,它就不會返回上一級並繼續遞歸。
該函數嘗試通過在層次結構中進行搜索,標識父對象,然后根據與請求匹配的id和type屬性添加子對象,從而將子對象添加到父對象。
這是一個示例層次結構:
Array
(
[0] => DataObject Object
(
[id:DataObject:private] => 1
[type:DataObject:private] => Collection
[properties:DataObject:private] => Array
(
[title] => Collection One
)
[childObjects:DataObject:private] => Array
(
[0] => DataObject Object
(
[id:DataObject:private] => 6
[type:DataObject:private] => Item
[properties:DataObject:private] => Array
(
[title] => Item Six
)
[childObjects:DataObject:private] => Array
(
)
)
[1] => DataObject Object
(
[id:DataObject:private] => 11
[type:DataObject:private] => Item
[properties:DataObject:private] => Array
(
[title] => Item Eleven
)
[childObjects:DataObject:private] => Array
(
)
)
[2] => DataObject Object
(
[id:DataObject:private] => 10
[type:DataObject:private] => Item
[properties:DataObject:private] => Array
(
[title] => Item Ten
)
[childObjects:DataObject:private] => Array
(
)
)
[3] => DataObject Object
(
[id:DataObject:private] => 14
[type:DataObject:private] => Item
[properties:DataObject:private] => Array
(
[title] => Item Fourteen
)
[childObjects:DataObject:private] => Array
(
)
)
[4] => DataObject Object
(
[id:DataObject:private] => 1
[type:DataObject:private] => ItemGroup
[properties:DataObject:private] => Array
(
[item_group_title] => 1
[item_group_depth] => 0
[item_group_parent_id] =>
)
[childObjects:DataObject:private] => Array
(
[0] => DataObject Object
(
[id:DataObject:private] => 7
[type:DataObject:private] => Item
[properties:DataObject:private] => Array
(
[title] => Item Seven
)
[childObjects:DataObject:private] => Array
(
)
)
[1] => DataObject Object
(
[id:DataObject:private] => 1
[type:DataObject:private] => Item
[properties:DataObject:private] => Array
(
[title] => Item One
)
[childObjects:DataObject:private] => Array
(
)
)
[2] => DataObject Object
(
[id:DataObject:private] => 2
[type:DataObject:private] => ItemGroup
[properties:DataObject:private] => Array
(
[item_group_title] => 1.1
[item_group_depth] => 1
[item_group_parent_id] => 1
)
[childObjects:DataObject:private] => Array
(
[0] => DataObject Object
(
[id:DataObject:private] => 8
[type:DataObject:private] => Item
[properties:DataObject:private] => Array
(
[title] => Item Eight
)
[childObjects:DataObject:private] => Array
(
)
)
)
)
[3] => DataObject Object
(
[id:DataObject:private] => 5
[type:DataObject:private] => ItemGroup
[properties:DataObject:private] => Array
(
[item_group_title] => 1.4
[item_group_depth] => 1
[item_group_parent_id] => 1
)
[childObjects:DataObject:private] => Array
(
[0] => DataObject Object
(
[id:DataObject:private] => 2
[type:DataObject:private] => Item
[properties:DataObject:private] => Array
(
[title] => Item Two
)
[childObjects:DataObject:private] => Array
(
)
)
)
)
)
)
)
)
)
函數失敗的地方是嘗試將ItemGroup 11添加到ItemGroup5。這是因為該函數通過數組遞歸,如下所示:
如果在第8項上沒有找到子項后又回來了,它將看到下一個對象是第5項,這就是我們要尋找的對象。
希望這很清楚我正在嘗試做的事情,並且我假設它很明顯,但是我正在使用的遞歸函數從未降級。 功能如下:
public function addChildObjToParentObj(array $objArray, DataObject $newParentObj, DataObject $newChildObj) {
// check if current array has correct DataObject
if (is_array($objArray)) {
foreach ($objArray as $key => $val) {
if (is_object($val) && $val instanceof DataObject) {
// check if id matches
if ($val->getId() === $newParentObj->getId()) {
echo "ID " . $val->getId() . " matches!<br>";
// check if type matches
if ($val->getType() === $newParentObj->getType()) {
echo "Type " . $val->getType() . " matches!<br>";
// object found that matches parent, add child to it
$val->addChildObject($newChildObj);
return TRUE;
}
}
// perform recursive search through objects children
if ($val->getChildObjects()) {
$childObjects = $val->getChildObjects();
return $this->addChildObjToParentObj($childObjects, $newParentObj, $newChildObj);
}
}
}
}
}
我見過其他人使用一個level變量來跟蹤深度,但是除非有必要,否則我不想實現它,希望遞歸能夠為我解決這個問題。 有沒有人? :)
您的代碼對我來說不錯,這讓我感到好奇。 我使用所有數組而不是對象模擬了一個簡單的版本,偶然發現了此修復程序:
return $this->addChildObjToParentObj($childObjects, $newParentObj, $newChildObj);
拿出這條線的return
,它應該工作。 起初我沒有意識到,但返回值導致它在您需要返回上一級時停止執行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.