用PHP/MySQL实现多级菜单

用PHP/MySQL实现多级菜单,php,mysql,html,menu,multidimensional-array,Php,Mysql,Html,Menu,Multidimensional Array,我正在尝试使用PHP创建从MySQL数据库获取数据的动态多级菜单。我已成功使用以下格式在php数组中订购菜单项: ----------------------- Array ( [1] => Array ( [id] => 1 [ubicacion] => top_a [nivel] => 1 [parent_id] => [tipo] => link [

我正在尝试使用PHP创建从MySQL数据库获取数据的动态多级菜单。我已成功使用以下格式在php数组中订购菜单项:

-----------------------
Array
(
[1] => Array
    (
        [id] => 1
        [ubicacion] => top_a
        [nivel] => 1
        [parent_id] => 
        [tipo] => link
        [link] => http://www.google.com
        [titulo] => Google
        [alias] => google_es
        [children] => Array
            (
                [3] => Array
                    (
                        [id] => 3
                        [ubicacion] => top_a
                        [nivel] => 2
                        [parent_id] => 1
                        [tipo] => link
                        [link] => http://www.gmail.com
                        [titulo] => Gmail
                        [alias] => gmail
                        [children] => Array
                            (
                                [4] => Array
                                    (
                                        [id] => 4
                                        [ubicacion] => top_a
                                        [nivel] => 3
                                        [parent_id] => 3
                                        [tipo] => link
                                        [link] => www.inbox.gmail.com
                                        [titulo] => Inbox
                                        [alias] => inbox_gmail
                                    )

                            )

                    )

            )
    )

[2] => Array
    (
        [id] => 2
        [ubicacion] => top_a
        [nivel] => 1
        [parent_id] => 
        [tipo] => link
        [link] => http://www.yahoo.com
        [titulo] => Yahoo
        [alias] => yahoo
    )
)
-----------------------
问题是,我不知道如何将这个数组作为HTML标记输出,这种方式可以处理n个级别。我可以使用固定数量的级别来执行此操作,如下所示:

foreach($menu_array as $menu) {
 echo "<li><a href='{$menu['link']}'>{$menu['titulo']}</a>";
 if (array_key_exists('children',$menu)) {
    echo "<ul>";
    foreach ($menu['children'] as $child_menu) {
        echo "<li><a href='{$child_menu['link']}'>{$child_menu['titulo']}</a>";
        if (array_key_exists('children',$child_menu)) {
            echo "<ul>";
            foreach ($child_menu['children'] as $child2_menu) {
                echo "<li><a href='{$child2_menu['link']}'>{$child2_menu['titulo']}</a>";
            }
            echo "</ul>";
        }
    }
    echo "</ul>";
}
echo "</li>";
}
foreach($menu\u数组作为$menu){
回声“
  • ”; 如果(数组键存在('children',$menu)){ 回声“
      ”; foreach($menu['children']作为$child\u menu){ 回声“
    • ”; 如果(数组键存在('children',$childrenu菜单)){ 回声“
        ”; foreach($child_菜单['childs']作为$child2_菜单){ 回声“
      • ”; } 回声“
      ”; } } 回声“
    ”; } 回声“
  • ”; }

    但这只适用于3个级别,我知道应该有办法解决这个问题,我知道我不是第一个遇到多维数组的HTML输出问题的人。

    您可以使用一点递归来达到更多级别

    function echo_menu($menu_array) {
        //go through each top level menu item
        foreach($menu_array as $menu) {
            echo "<li><a href='{$menu['link']}'>{$menu['titulo']}</a>";
            //see if this menu has children
            if(array_key_exists('children', $menu)) {
                echo '<ul>';
                //echo the child menu
                echo_menu($menu['children']);
                echo '</ul>';
            }
            echo '</li>';
        }
    }
    
    echo '<ul>';
    echo_menu($menu_array);
    echo '</ul>';
    
    function echo\u菜单($menu\u数组){
    //浏览每个顶级菜单项
    foreach($menu\u数组作为$menu){
    回声“
  • ”; //看看这个菜单是否有子菜单 如果(数组键存在('children',$menu)){ 回声“
      ”; //回显子菜单 echo_菜单($menu['children']); 回声“
    ”; } 回音“
  • ”; } } 回声“
      ”; echo_菜单($menu_数组); 回声“
    ”;

    这将适用于任意数量的子级别。

    您是否介意提供一点背景信息,说明为什么需要在数据库中设置菜单?我正在为将来的项目定制CMS任何数量的级别,直到达到递归限制;)我认为这是一个特征。没有人想浏览这么多嵌套菜单!;)非常感谢:)它起作用了。我不知道我怎么会想不出这一点:我知道人们不想看到20级菜单:P但我认为在处理用户输入时涵盖所有可能的场景总是好的@menu\u数组中考虑了什么?你能举例说明吗?谢谢:)