我正在尝试创建一个嵌套的PHP菜单,应该在点击时展开子菜单,我不能使用Javascript所以一切都需要是PHP。现在我将我的菜单布局存储在一个数组中:
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);
该功能将生成整个菜单并直接显示所有子菜单:
menu1 (?c=1)
menu1-1 (?c=2)
menu1-1-1 (?c=3)
menu1-1-1-1 (?c=18)
menu1-2 (?c=4)
menu1-3 (?c=5)
menu1-4 (?c=17)
menu3 (?c=7)
menu2 (?c=6)
我想知道他们是否是一种简单的方法来修改我的功能只显示所选的子菜单? 例如: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)
答案 0 :(得分:0)
使用数组检查是否选择了菜单节点,在这种情况下继续递归,如果未选择节点或没有子菜单则从递归返回
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;
}
例如,如果选择了第18项,则应调用函数(包含数组中的所有选定项):
$selection = array(1, 2, 18);
buildMenu($parent, $menu, $selection);
这只是一种快速方法(甚至没有经过测试),您可以进一步完善解决方案,但只是想知道如何更改函数的递归以实现您正在寻找的内容。你可以将第二个if包含在第一个中,只是将条件添加到第一个if(但是我写的方式更清楚)。
希望这会有所帮助。