簡體   English   中英

通過層次結構的PHP遞歸函數不會返回一個級別

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM