2017-06-29 94 views
0

我有一個遞歸例子,我想知道的幾件事。這是例子: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變化超過設定在接下來的itemforeach循環? 所以,爲了說明我的困惑,我會嘗試用下面的例子來解釋它。

因此,例如,如果在$menuItems第一$item$itemParentId = 0,比它通過條件

if ($itemParentId == $parentId) 

,並再次調用該函數在這裏:

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

所以,我路過第一$itemID,例如112和再次調用該函數,其中$parentId等於112。然後當函數再次被調用時,我們進入foreach循環並且從第一個開始$item開始,並且由於$parentId現在是112而且$item parent_id0我們不通過條件if ($itemParentId == $parentId)並且$children不返回任何東西這一輪。所以,我們剛剛結束了

$res[$item->ID] = $item 

但是,那麼我不知道,當第二item自帶例如會發生什麼,不具備parent_id設置爲0,但對112,這是前面的itemID。我們如何填補submenu陣列時,它不會通過的條件

if ($itemParentId == $parentId) 

如果parentId0

我不知道,如果我的流程的解釋是正確的,在所有的,但是我如何計算的,所以如果有人能夠清楚這一點,我將非常感激。 這是平坦$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" 
      ] 

回答

0

您沒有改變所述功能的任何地方的$parentId值。如果你是,那麼,因爲變量是在循環外定義的,所以它會改變這個值。

+0

但是,如果第二個項目的父項ID是除0之外的某個數字,並且parentId參數保持爲0,那麼第二個項目如何進入塊'''if if($ itemParentId == $ parentId)'''這就是我不明白的地方,我會嘗試擴展我的問題來說明我對此的困惑 – Leff

+0

'$ itemParentId'來自'$ item'本身 - 它可能有一個與之關聯的父項。 '$ parentId'參數是可選的,以防您只想獲得與特定父級關聯的'$ menuItems'。我假設'$ item'的默認父值是0(頂級菜單項)。 –

0

下面的行調用該方法menuBuilder與該項目中的該PARENT_ID for循環。

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

但我不知道代碼是否停止?因爲你沒有改變數組menuItems,所以每個遞歸調用都使用相同的菜單項運行for循環。

+0

是的,這就是爲什麼所有這些都讓我感到困惑,因爲我得到了像菜單數據結構那樣的結果樹,當我以爲它只會停止,因爲它只會與第一個元素一起循環。 – Leff

+0

你知道嗎,'$ menuItems'數組是怎麼樣的? –

+0

是的,我可以發佈這個例子 – Leff