2016-04-24 72 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 
             ) 

           ) 

         ) 

       ) 

     ) 

)