带有单击展开功能的PHP嵌套菜单

带有单击展开功能的PHP嵌套菜单,php,Php,我正在尝试创建一个嵌套的PHP菜单,它应该在单击时展开子菜单,我不能使用Javascript,所以所有内容都需要是PHP。现在,我将菜单布局存储在一个数组中: Array ( [items] => Array ( [1] => Array ( [menu_id] => 1 [menu_name] => menu1 [men

我正在尝试创建一个嵌套的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);
我想知道他们是否是一个简单的方法来修改我的功能,只显示选定的子菜单? 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);