从PHP数组构建引导程序下拉多级菜单 [英] Build a bootstrap drop-down multi-level menu from a PHP array
问题描述
我正在尝试从PHP中的数组制作一个引导程序下拉菜单.
I'm trying to make a bootstrap drop-down menu from an array in PHP.
我已经编写了一个递归菜单功能,但是我在添加引导程序所需的自定义html属性方面很挣扎.
I have written a recursive menu function, but I am struggling with adding the custom html attributes required for bootstrap.
我的菜单数组具有以下格式:
My menu array is in the following format:
$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:
And the PHP to build the menu from an array as above:
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属性需要进行一些更改:
Your menu function was working for me, but the menu's html attributes needed some alteration:
<?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布尔值来构造URL路径,或者将URL显式添加到菜单数组中并进行相应调整.
You could pass in a parent path segment instead of the $is_sub boolean to construct url paths, or add the urls explicitly to the menu array and adjust accordingly.
这篇关于从PHP数组构建引导程序下拉多级菜单的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!