带有单击展开功能的PHP嵌套菜单
我正在尝试创建一个嵌套的PHP菜单,它应该在单击时展开子菜单,我不能使用Javascript,所以所有内容都需要是PHP。现在,我将菜单布局存储在一个数组中:带有单击展开功能的PHP嵌套菜单,php,Php,我正在尝试创建一个嵌套的PHP菜单,它应该在单击时展开子菜单,我不能使用Javascript,所以所有内容都需要是PHP。现在,我将菜单布局存储在一个数组中: Array ( [items] => Array ( [1] => Array ( [menu_id] => 1 [menu_name] => menu1 [men
Array
(
[items] => Array
(
[1] => Array
(
[menu_id] => 1
[menu_name] => menu1
[menu_parent] => 0
)
[7] => Array
(
[menu_id] => 7
[menu_name] => menu3
[menu_parent] => 0
)
[6] => Array
(
[menu_id] => 6
[menu_name] => menu2
[menu_parent] => 0
)
[2] => Array
(
[menu_id] => 2
[menu_name] => menu1-1
[menu_parent] => 1
)
[4] => Array
(
[menu_id] => 4
[menu_name] => menu1-2
[menu_parent] => 1
)
[5] => Array
(
[menu_id] => 5
[menu_name] => menu1-3
[menu_parent] => 1
)
[17] => Array
(
[menu_id] => 17
[menu_name] => menu1-4
[menu_parent] => 1
)
[3] => Array
(
[menu_id] => 3
[menu_name] => menu1-1-1
[menu_parent] => 2
)
[18] => Array
(
[menu_id] => 18
[menu_name] => menu1-1-1-1
[menu_parent] => 3
)
[20] => Array
(
[menu_id] => 20
[menu_name] => menu7-2
[menu_parent] => 11
)
[19] => Array
(
[menu_id] => 19
[menu_name] => menu7-1
[menu_parent] => 11
)
)
[parents] => Array
(
[0] => Array
(
[0] => 1
[1] => 7
[2] => 6
)
[1] => Array
(
[0] => 2
[1] => 4
[2] => 5
[3] => 17
)
[2] => Array
(
[0] => 3
)
[3] => Array
(
[0] => 18
)
[11] => Array
(
[0] => 20
[1] => 19
)
)
)
要循环数组并创建菜单,我使用此函数:
function buildMenu($parent, $menu)
{
$html = "";
if (isset($menu['parents'][$parent]))
{
$html .= "<ul>\n";
foreach ($menu['parents'][$parent] as $itemId)
{
if(!isset($menu['parents'][$itemId]))
{
//IF MENU DONT HAVE SUBMENU
$html .= "<li>\n <a href='?c=".$menu['items'][$itemId]['menu_id']."'>".$menu['items'][$itemId]['menu_name']."</a>\n</li> \n";
}
if(isset($menu['parents'][$itemId]))
{
//IF MENU HAS SUBMENU
$html .= "<li>\n <a href='?c=".$menu['items'][$itemId]['menu_id']."'>".$menu['items'][$itemId]['menu_name']."</a> \n";
$html .= buildMenu($itemId, $menu);
$html .= "</li> \n";
}
}
$html .= "</ul> \n";
}
return $html;
}
echo buildMenu(0, $menu);
我想知道他们是否是一个简单的方法来修改我的功能,只显示选定的子菜单?
Exempel:menu.php?c=1_2
menu1 (?c=1)
menu1-1 (?c=1_2)
menu1-1-1 (?c=1_2_18)
menu1-2 (?c=1_4)
menu1-3 (?c=1_5)
menu1-4 (?c=1_17)
menu3 (?c=7)
menu2 (?c=6)
使用数组检查菜单的节点是否选中,在这种情况下继续递归,如果节点未选中或没有子菜单,则从递归返回
function buildMenu($parent, $menu, array $selection)
{
$html = "";
if (isset($menu['parents'][$parent]))
{
$html .= "<ul>\n";
foreach ($menu['parents'][$parent] as $itemId)
{
if(!isset($menu['parents'][$itemId]))
{
//IF MENU DONT HAVE SUBMENU
$html .= "<li>\n <a href='?c=".$menu['items'][$itemId]['menu_id']."'>".$menu['items'][$itemId]['menu_name']."</a>\n</li> \n";
}
if(!in_array($menu['parents'][$itemId], $selection))
{
//IF MENU OPTION IS NOT SELECTED DON'T SHOW SUBMENU
$html .= "<li>\n <a href='?c=".$menu['items'][$itemId]['menu_id']."'>".$menu['items'][$itemId]['menu_name']."</a>\n</li> \n";
}
if(isset($menu['parents'][$itemId]))
{
//IF MENU HAS SUBMENU
$html .= "<li>\n <a href='?c=".$menu['items'][$itemId]['menu_id']."'>".$menu['items'][$itemId]['menu_name']."</a> \n";
$html .= buildMenu($itemId, $menu, $selection);
$html .= "</li> \n";
}
}
$html .= "</ul> \n";
}
return $html;
}
这只是一种快速的方法(甚至没有经过测试),您可以对解决方案进行更多的细化,但只是给出了如何更改函数递归以实现所需的想法。您可以将第二个if包含到第一个if中,只需将条件添加到第一个if中(但我写的方式更清楚)
希望这有帮助 “我正在尝试创建一个嵌套的PHP菜单,它应该在单击时展开子菜单,我不能使用Javascript,所以所有内容都需要是PHP。”-你意识到每次单击都会重新加载页面吗?为什么你不能使用JavaScript?既然你不能使用JavaScript,你有没有考虑过查看纯CSS下拉菜单,每次点击都保存页面刷新。不确定是否支持浏览器。这是用于什么类型的网站?Fredd,谢谢你的回答。我已经考虑过CSS下拉菜单,但我现在想避免悬停菜单。。。
function buildMenu($parent, $menu, array $selection)
{
$html = "";
if (isset($menu['parents'][$parent]))
{
$html .= "<ul>\n";
foreach ($menu['parents'][$parent] as $itemId)
{
if(!isset($menu['parents'][$itemId]))
{
//IF MENU DONT HAVE SUBMENU
$html .= "<li>\n <a href='?c=".$menu['items'][$itemId]['menu_id']."'>".$menu['items'][$itemId]['menu_name']."</a>\n</li> \n";
}
if(!in_array($menu['parents'][$itemId], $selection))
{
//IF MENU OPTION IS NOT SELECTED DON'T SHOW SUBMENU
$html .= "<li>\n <a href='?c=".$menu['items'][$itemId]['menu_id']."'>".$menu['items'][$itemId]['menu_name']."</a>\n</li> \n";
}
if(isset($menu['parents'][$itemId]))
{
//IF MENU HAS SUBMENU
$html .= "<li>\n <a href='?c=".$menu['items'][$itemId]['menu_id']."'>".$menu['items'][$itemId]['menu_name']."</a> \n";
$html .= buildMenu($itemId, $menu, $selection);
$html .= "</li> \n";
}
}
$html .= "</ul> \n";
}
return $html;
}
$selection = array(1, 2, 18);
buildMenu($parent, $menu, $selection);