2016-04-24 36 views
0

我有一個包含菜單項的數組。每個項目都有其parent_id。我正在尋找並嘗試了很多小時,但無法弄清楚如何遞歸遍歷數組。我不擅長遞歸。遞歸創建菜單數組

我試圖使用下面的帖子中的代碼。它生成的HTML菜單,但它錯過了第一條記錄也我想要一個數組,所以我可以自定義HTML菜單的陣列。

Using recursion to build navigation

我曾試圖從其他崗位這個代碼,但它返回空數組。

create_array(-1, $array); 

function create_array($number, $data) 
{ 
    $result = array(); 
    foreach ($data as $row) 
    { 
     if ($row['parent_id'] == $number) 
     { 
      $result[$row['id']] = create_array($row['id'], $data); 
     } 
    } 
    return $result; 
} 

數據陣列:

Array 
(
    [0] => Array 
     (
      [id] => 1 
      [parent_id] => -1 
      [url] => /home 
     ) 

    [1] => Array 
     (
      [id] => 2 
      [parent_id] => 0 
      [url] => /page 
     ) 

    [2] => Array 
     (
      [id] => 3 
      [parent_id] => 2 
      [url] => /page/sub_page 
     ) 

    [3] => Array 
     (
      [id] => 4 
      [parent_id] => 3 
      [url] => /page/sub_page/inner_page/ 
     ) 

) 

結果期望:

home - page 
     sub_page 
      inner_page 

任何幫助將非常理解請。

+0

@larsAnders,該數據是從與自參考父ID的單個表。 id爲0是非子元素,-1是主頁其他willhave + vs id作爲父母id – Bsienn

+0

$ number是什麼? – Adam

+0

@ null05其主頁的起始頁面爲-1。該功能運行不正常。 – Bsienn

回答

1

它應該做的是先打印0作爲父母,爲每個人找到它的孩子,並開始爲每個孩子。

喜歡的東西:

function menu($data,$parent=-1) { 
    $res='';  
    foreach($data as $e) { 
     if($e['parent_id']==$parent||($parent==-1&&$e['parent_id']==0)) { //Also search for 0 when parent is -1 as are both the roots 
      $res.='<li>'.$e['url']; //Or whatever you want to show 
      $sub=menu($data,$e['id']); 
      if($sub) $res.='<ul>'.$sub.'</ul>'; 
      $res.='</li>'; 
     } 
    } 
    return $res; 
} 

<ul><?=menu($data)?></ul> 
+0

謝謝你一堆。這很好。我會用這個,但是你能提供一種返回數組而不是打印它的方法嗎?我不明白該怎麼做。但是這對我的情況非常好。 – Bsienn

+1

完全和你一樣。填充數組而不是打印。 – Gabriel

0

由於加布裏埃爾,我用自己的方法來創建返回菜單的數組的另一種方法。

$data = array(
    array('id'=>1, 'parent_id'=>-1, 'url_title'=>'home', 'url'=>'/home'), 
    array('id'=>2, 'parent_id'=>0, 'url_title'=>'page-one', 'url'=>'/page-one'), 
    array('id'=>3, 'parent_id'=>2, 'url_title'=>'sub-page', 'url'=>'/sub-page'), 
    array('id'=>4, 'parent_id'=>3, 'url_title'=>'inner-page', 'url'=>'/inner-page') 
    ); 


function menu_html($data,$parent=-1) { 
    $res=''; 
    foreach($data as $e) { 
     if($e['parent_id']==$parent||($parent==-1&&$e['parent_id']==0)) { 
      $res.='<li>'.$e['url']; 
      $sub=menu_html($data,$e['id']); 
      if($sub) $res.='<ul>'.$sub.'</ul>'; 
      $res.='</li>'; 
     } 
    } 
    return $res; 
} 

echo '<ul>'.menu_html($data).'</ul>'; 

function menu_array($data,$parent=-1) { 
    $res=array(); 
    foreach($data as $e) { 
     if($e['parent_id']==$parent||($parent==-1&&$e['parent_id']==0)) { 
      $res[$e['url']] = $e; 
      $sub=menu_array($data, $e['id']); 
      if($sub) $res[$e['url']]['sub-nav'] = $sub; 
     } 
    } 
    return $res; 
} 

echo "<pre>"; 
print_r(menu_array($data)); 
echo "</pre>"; 

輸出:實際上

/home 
    /page-one 
     /sub-page 
      /inner-page 

Array 
(
    [/home] => Array 
     (
      [id] => 1 
      [parent_id] => -1 
      [url_title] => home 
      [url] => /home 
     ) 

    [/page-one] => Array 
     (
      [id] => 2 
      [parent_id] => 0 
      [url_title] => page-one 
      [url] => /page-one 
      [sub-nav] => Array 
       (
        [/sub-page] => Array 
         (
          [id] => 3 
          [parent_id] => 2 
          [url_title] => sub-page 
          [url] => /sub-page 
          [sub-nav] => Array 
           (
            [inner-page] => Array 
             (
              [id] => 4 
              [parent_id] => 3 
              [url_title] => inner-page 
              [url] => inner-page 
             ) 

           ) 

         ) 

       ) 

     ) 

)