php - 从 PHP 数组构建 Bootstrap 下拉多级菜单

标签 php arrays twitter-bootstrap menu

我正在尝试从 PHP 中的数组制作一个 Bootstrap 下拉菜单。

我已经编写了一个递归菜单函数,但我正在努力添加 Bootstrap 所需的自定义 html 属性。

我的菜单数组采用以下格式:

$menu = array(
   'calendar' => array(
      'text'   => 'Calendar',
      'rights' => 'user'
   ),
   'customers' => array(
      'text'   => 'Customers',
      'rights' => 'user',
      'sub' => array(
         'create-new' => array(
            'text'   => 'Create new customer',
            'rights' => 'user'
         ),
         'show-customers' => array(
            'text'   => 'Show all customers',
            'rights' => 'user'
         )
      )
   )
);

以及从上面的数组构建菜单的 PHP:

function buildMenu($menu_array, $is_sub=FALSE) {

   $attr = (!$is_sub) ? ' id="menu"' : ' class="submenu"';
   $menu = "<ul".$attr.">";

   foreach($menu_array as $id => $properties) {
      foreach($properties as $key => $val) {
         if(is_array($val)) {
            $sub = buildMenu($val, TRUE);
         }
         else {
            $sub = NULL;
            $$key = $val;
         }
      }
      if(!isset($url)) {
         $url = $id;
      }
      $menu .= "<li><a href=".$url.">".$text."</a>".$sub."</li>";
      unset($url, $text, $sub);
   }

   return $menu . "</ul>";
}

echo $output = buildMenu($menu);

我想要的输出是:

<ul class="nav navbar-nav">
    <li><a href="#">Calendrier</a></li>
    <li class="dropdown">
        <a href="#" class="dropdown-toggle" data-toggle="dropdown">Customers <span class="caret"></span></a>
        <ul class="dropdown-menu">
            <li><a href="#">Create new customer</a></li>
            <li><a href="#">Show all customers</a></li>
        </ul>
    </li>
</ul>

最佳答案

您的菜单功能对我有用,但菜单的 html 属性需要一些更改:

<?php
function buildMenu(array $menu_array, $is_sub=FALSE)
{
   $ul_attrs = $is_sub ? 'class="dropdown-menu"' : 'class="nav navbar-nav"';
   $menu = "<ul $ul_attrs>";

   foreach($menu_array as $id => $attrs) {
      $sub = isset($attrs['sub']) 
         ? buildMenu($attrs['sub'], TRUE) 
         : null;
      $li_attrs = $sub ? 'class="dropdown"' : null;
      $a_attrs  = $sub ? 'class="dropdown-toggle" data-toggle="dropdown"' : null;
      $carat    = $sub ? '<span class="caret"></span>' : null;
      $menu .= "<li $li_attrs>";
      $menu .= "<a href='$id' $a_attrs>${attrs['text']}$carat</a>$sub";
      $menu .= "</li>";
   }

   return $menu . "</ul>";
}

您可以传入父路径段而不是 $is_sub bool 值来构造 url 路径,或者将 url 显式添加到菜单数组并进行相应调整。

关于php - 从 PHP 数组构建 Bootstrap 下拉多级菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35527414/

相关文章:

php - 使用自定义日期字符串在 PHP 中从 MySQL 获取最近 24 小时的数据

php - WWW 到非 WWW 使用 PHP 重定向

arrays - Matlab reshape 水平猫

c - 收缩 int 数组 C

javascript - 如何使用 Bootstrap 为点击的元素创建具有滚动和溢出功能的 Facebook 固定侧边栏?

javascript - Particles.js Canvas 位于其他 Bootstrap 轮播幻灯片位置时不起作用

angular - ng-bootstrap 不工作如果 'ngb-xx' 是一个 Angular 组件,那么验证它是这个模块的一部分

PHP 将 ISO-8859-3 字符转换为 UTF-8

php - 更新 PHP CMS 网站以完全支持 unicode/utf8

Java - 如何在for循环中修改数组并在for循环退出后记住它?