PHP - 递归示例说明

时间:2017-06-29 08:53:36

标签: php recursion

我有一个递归示例,我想知道一些事情。这是一个例子:

    private function menuBuilder($menuItems, $parentId = 0)
    {
        $res = [];

        foreach ($menuItems as $index => $item) {
            $itemParentId = $item->meta->_menu_item_menu_item_parent;

            if ($itemParentId == $parentId) {
                $children = $this->menuBuilder($menuItems, $item->ID);

                if ($children) {
                    $item['submenu'] = $children;
                }

                $res[$item->ID] =  $item;
                unset($menuItems[$index]);
            }
        }

        return $res;
    }

这是函数返回的$res

{
    "112": {
        "ID": 112,
        "submenu": {
            "135": {
                "ID": 135,
                "title": "",
                "slug": "135",
                "url": "http://hivnorge.app/?p=135",
                "status": "publish",
                "main_category": "Hovedmeny"
            },
            "137": {
                "ID": 137,
                "submenu": {
                    "138": {
                        "ID": 138,
                        "title": "",
                        "slug": "138",
                        "url": "http://hivnorge.app/?p=138",
                        "status": "publish",
                        "main_category": "Hovedmeny"
                    }
                },
                "title": "",
                "slug": "137",
                "url": "http://hivnorge.app/?p=137",
                "status": "publish",
                "main_category": "Hovedmeny"
            }
        },
        "title": "Hjem",
        "slug": "hjem",
        "url": "http://hivnorge.app/?p=112",
        "status": "publish",
        "main_category": "Hovedmeny"
    },
    "136": {
        "ID": 136,
        "title": "",
        "slug": "136",
        "url": "http://hivnorge.app/?p=136",
        "status": "publish",
        "main_category": "Hovedmeny"
    },
    "139": {
        "ID": 139,
        "title": "",
        "slug": "139",
        "url": "http://hivnorge.app/?p=139",
        "status": "publish",
        "main_category": "Hovedmeny"
    }
}

在这里,我传递一个平面数组$menuItems,其中每个菜单项都有一个parent_id字段,items parent_id设置为0在结构树的根部。我在这个递归方法中想知道,因为我之前从未创建过一个,当第一个将parent_id设置为0之外的其他东西的元素传递foreach循环时,是否值在默认参数$parentId = 0中设置的更改比item循环中的下一个foreach更改? 因此,为了说明我的困惑,我将尝试使用以下示例来解释它。

所以,例如,如果$item中的第一个$menuItems有一个$itemParentId = 0,那么它通过条件

   if ($itemParentId == $parentId) 

再次调用此处的函数:

$children = $this->menuBuilder($menuItems, $item->ID);

所以,我传递了第一个ID的{​​{1}},例如$item,并再次调用112等于$parentId的函数。然后,当再次调用该函数时,我们输入foreach循环并使用第一个112重新开始,因为$item现在是$parentId112是{{ 1}}我们没有通过条件$item parent_id0没有在此回合中返回任何内容。所以,我们最终得到了

if ($itemParentId == $parentId)

但是,我不确定当第二个$children出现时会发生什么,$res[$item->ID] = $item 没有设置为0,而是item,这是之前parent_id的{​​{1}}。如果112数组无法通过条件

,我们如何填充它们
ID

如果item保持submenu

我不确定,如果我对流程的解释完全正确,但这就是我的想法,所以如果有人能清楚这一点我会非常感激。 这是平面if ($itemParentId == $parentId) 数组中的元素:

parentId

2 个答案:

答案 0 :(得分:0)

您没有在函数中的任何位置更改$parentId的值。如果你是,那么,因为变量是在循环之外定义的,所以它会改变值。

答案 1 :(得分:0)

以下行使用for循环中项目的parent_id调用方法menuBuilder

$children = $this->menuBuilder($menuItems, $item->ID);

但是我想知道代码是否会停止?因为你不是数组menuItems,所以每次递归调用都会运行带有相同菜单项的for循环。