我有一個遞歸例子,我想知道的幾件事。這是例子:PHP - 遞歸例子解釋
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
循環? 所以,爲了說明我的困惑,我會嘗試用下面的例子來解釋它。
因此,例如,如果在$menuItems
第一$item
有$itemParentId = 0
,比它通過條件
if ($itemParentId == $parentId)
,並再次調用該函數在這裏:
$children = $this->menuBuilder($menuItems, $item->ID);
所以,我路過第一$item
的ID
,例如112
和再次調用該函數,其中$parentId
等於112
。然後當函數再次被調用時,我們進入foreach循環並且從第一個開始$item
開始,並且由於$parentId
現在是112
而且$item parent_id
是0
我們不通過條件if ($itemParentId == $parentId)
並且$children
不返回任何東西這一輪。所以,我們剛剛結束了
$res[$item->ID] = $item
但是,那麼我不知道,當第二item
自帶例如會發生什麼,不具備parent_id
設置爲0,但對112
,這是前面的item
的ID
。我們如何填補submenu
陣列時,它不會通過的條件
if ($itemParentId == $parentId)
如果parentId
留0
我不知道,如果我的流程的解釋是正確的,在所有的,但是我如何計算的,所以如果有人能夠清楚這一點,我將非常感激。 這是平坦$menuItems
數組中的元素:
#attributes: array:23 [
"ID" => 135
"post_author" => 1
"post_date" => "2017-06-23 10:59:47"
"post_date_gmt" => "2017-06-23 08:59:47"
"post_content" => " "
"post_title" => ""
"post_excerpt" => ""
"post_status" => "publish"
"comment_status" => "closed"
"ping_status" => "closed"
"post_password" => ""
"post_name" => "135"
"to_ping" => ""
"pinged" => ""
"post_modified" => "2017-06-29 09:37:49"
"post_modified_gmt" => "2017-06-29 07:37:49"
"post_content_filtered" => ""
"post_parent" => 0
"guid" => "http://hivnorge.app/?p=135"
"menu_order" => 2
"post_type" => "nav_menu_item"
"post_mime_type" => ""
"comment_count" => 0
]
"meta" => PostMetaCollection {#243
#attributes: array:4 [
"meta_id" => 326
"post_id" => 135
"meta_key" => "_menu_item_menu_item_parent"
"meta_value" => "112"
]
但是,如果第二個項目的父項ID是除0之外的某個數字,並且parentId參數保持爲0,那麼第二個項目如何進入塊'''if if($ itemParentId == $ parentId)'''這就是我不明白的地方,我會嘗試擴展我的問題來說明我對此的困惑 – Leff
'$ itemParentId'來自'$ item'本身 - 它可能有一個與之關聯的父項。 '$ parentId'參數是可選的,以防您只想獲得與特定父級關聯的'$ menuItems'。我假設'$ item'的默認父值是0(頂級菜單項)。 –