2017-06-29 4 views
0

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 parentId0

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" 
      ] 

Antwort

0

Sie sind nicht den Wert von $parentId überall in der Funktion zu verändern. Wenn Sie dies tun würden, würde der Wert geändert, da die Variable außerhalb der Schleife definiert ist.

+0

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

+0

'$ 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). –

0

Die folgende Zeile ruft die Methode menuBuilder mit der parent_id des Elements in der for-Schleife auf.

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

Aber ich frage mich, ob der Code aufhört? Da Sie das Array menuItems nicht ändern, wird bei jedem rekursiven Aufruf die for-Schleife mit denselben Menüelementen ausgeführt.

+0

Ja, das ist der Grund, warum all das verwirrend wurde, weil ich als Ergebnis eine baumartige Struktur von Menüdaten bekommen habe, als ich dachte, es würde einfach aufhören, weil es nur mit dem ersten Element eine Schleife bilden würde. – Leff

+0

Wissen Sie, wie das Array '$ menuItems' aussieht? –

+0

Ja, ich kann das Beispiel posten – Leff

Verwandte Themen