我有一个递归示例,我想知道一些事情。这是一个例子:
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
现在是$parentId
而112
是{{ 1}}我们没有通过条件$item parent_id
而0
没有在此回合中返回任何内容。所以,我们最终得到了
if ($itemParentId == $parentId)
但是,我不确定当第二个$children
出现时会发生什么,$res[$item->ID] = $item
没有设置为0,而是item
,这是之前parent_id
的{{1}}。如果112
数组无法通过条件
ID
如果item
保持submenu
我不确定,如果我对流程的解释完全正确,但这就是我的想法,所以如果有人能清楚这一点我会非常感激。
这是平面if ($itemParentId == $parentId)
数组中的元素:
parentId
答案 0 :(得分:0)
您没有在函数中的任何位置更改$parentId
的值。如果你是,那么,因为变量是在循环之外定义的,所以它会改变值。
答案 1 :(得分:0)
以下行使用for循环中项目的parent_id调用方法menuBuilder
。
$children = $this->menuBuilder($menuItems, $item->ID);
但是我想知道代码是否会停止?因为你不是数组menuItems
,所以每次递归调用都会运行带有相同菜单项的for循环。