递归创建菜单数组


create menu array recursively

我有一个包含菜单项的数组。每个项目都有其parent_id。我正在搜索并尝试了很多小时,但无法弄清楚如何递归遍历数组。我不擅长递归。

我尝试使用以下帖子中的代码。它生成 html 菜单,但它错过了第一条记录,我也想要一个数组,这样我就可以从数组中制作自定义 html 菜单。

使用递归构建导航

我已经从其他帖子中尝试了此代码,但它返回空数组。

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 作为父级的那些,为每个孩子找到它是子项,然后为每个子项重新开始。

像这样:

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>

感谢 Gabriel,我使用他的方法创建了一个返回菜单数组的另一个方法。

 $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
                                        )
                                )
                        )
                )
        )
)