用PHP/MySQL实现多级菜单
我正在尝试使用PHP创建从MySQL数据库获取数据的动态多级菜单。我已成功使用以下格式在php数组中订购菜单项:用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 [
-----------------------
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数组中考虑了什么?你能举例说明吗?谢谢:)