【问题标题】:Multi level menu with PHP/MySQL带有 PHP/MySQL 的多级菜单
【发布时间】:2012-07-09 09:46:35
【问题描述】:

我正在尝试使用 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
    )
)
-----------------------

问题是我不知道如何以适用于 n 级的方式将此数组输出为 HTML 标记。我可以像这样使用固定数量的级别来做到这一点:

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>";
}

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

【问题讨论】:

  • 您介意提供一些背景信息吗?为什么需要将菜单放在数据库中?
  • 我正在为未来的项目做一个定制的 CMS

标签: php mysql html menu multidimensional-array


【解决方案1】:

您可以使用一点递归来获得更多级别。

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>';

这适用于您想要的任意数量的子级别。

【讨论】:

  • 任意数量的级别,直到你达到递归限制;)
  • 我称之为功能。没有人愿意浏览那么多嵌套菜单! ;)
  • 非常感谢 :) 它有效。我不知道我怎么想不到这个:P
  • 我知道人们不想看到 20 级菜单:P 但我认为在处理用户输入时涵盖所有可能的场景总是好的
  • @menu_array 中考虑了什么?你能在例子中怎么做吗?谢谢:)
猜你喜欢
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多