Ich habe eine Rekursion Beispiel, und ich wundere mich über ein paar Dinge. Dies ist das Beispiel:PHP - Rekursion Beispiel Erklärung
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;
}
Und die $res
, das die Funktion gibt: Hier
{
"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"
}
}
, ich vorbei eine flache Array $menuItems
mit Menüpunkten, die jeweils einen Satz parent_id
Feld haben, und die items
, die parent_id
auf 0
gesetzt haben, sind die Wurzel der baumartigen Struktur. Was ich in dieser Rekursionsmethode frage, da ich nie zuvor eine gemacht habe, ist, wenn das erste Element, das eine parent_id
auf etwas anderes als 0
setzt, die foreach-Schleife übergibt, ändert sich der Wert im Standardargument $parentId = 0
als für den nächsten kommenden item
in der foreach
Schleife? Also, um meine Verwirrung zu illustrieren, werde ich versuchen, es mit dem folgenden Beispiel zu erklären.
zum Beispiel so, wenn die ersten $item
im $menuItems
ein $itemParentId = 0
hat, als es um den Zustand gelangt
if ($itemParentId == $parentId)
und fordert erneut die Funktion hier:
$children = $this->menuBuilder($menuItems, $item->ID);
Also, ich bin vorbei eine ID
der ersten $item
, zum Beispiel 112
und erneut aufrufen die Funktion, wo die $parentId
gleich 112
ist. Dann, wenn die Funktion wieder dort genannt wird, geben wir foreach-Schleife und beginnen wieder mit dem ersten $item
, und da die $parentId
jetzt ist 112
und die $item parent_id
ist 0
passieren wir nicht die Bedingung if ($itemParentId == $parentId)
und die $children
kehrt nicht alles in diese Runde. Also, wir nur am Ende mit
$res[$item->ID] = $item
Aber dann bin ich nicht sicher, was passiert, wenn die zweiten item
zum Beispiel herauskommt, das nicht über die parent_id
auf 0 gesetzt, sondern auf die 112
, die das ist ID
der vorherigen item
. Wie füllen wir die submenu
Array, wenn es nicht die Bedingung
if ($itemParentId == $parentId)
passieren würde, wenn die parentId
0
blieb ich bin nicht sicher, ob meine Interpretation der Strömung überhaupt richtig ist, aber das So habe ich es gedacht, also würde ich es sehr schätzen, wenn jemand das klären könnte. Dies ist das Element, in dem flachen $menuItems
Array:
#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"
]
Aber, wie kommt dann das zweite Element in den Block '' 'if ($ itemParentId == $ parentId)' '' Wenn es Eltern-ID ist eine andere Zahl als 0, und das parentId Argument blieb 0? Das ist, was ich nicht verstehe, ich werde versuchen, meine Frage zu erweitern, um meine Verwirrung mit diesem – Leff
'$ itemParentId' zu illustrieren kommt von dem' $ item' selbst - es kann ein Elternteil damit verbunden haben. Der Parameter '$ parentId' ist optional, falls Sie nur die' $ menuItems' erhalten möchten, die einem bestimmten Elternteil zugeordnet sind. Ich nehme an, dass der Standard-Elternwert eines $ -Eintrags 0 ist (oberste Menüpunkte). –