我有这个代码的问题,我可以有第一级,在第二级我有一个id号和3eme级别没有。
我需要找到4个深层次的信息
此代码也会产生错误:Illegal string offset 'label'
:
foreach($menu_sub[$submenus['sub_menu']] as $sub2_key => $submenus2) {
结果
index
---- 8
--------- not appear
--------- not appear
---- 3
---- 2
---- I
Configuration
---- 9
--------- not appear
--------- not appear
----1
----1
----M
----1
Catalogue
数据库
CREATE TABLE `administrator_menu` (
`id` int(11) NOT NULL,
`link` mediumtext NOT NULL,
`parent_id` int(11) NOT NULL,
`sort_order` int(11) NOT NULL,
`class` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--
-- Dumping data for table `administrator_menu`
--
INSERT INTO `administrator_menu` (`id`, `link`, `parent_id`, `sort_order`, `class`) VALUES
(1, '', 0, 2, ''),
(3, '', 0, 1, ''),
(5, '', 0, 3, ''),
(6, '', 0, 4, ''),
(7, '', 3, 1, ''),
(8, '', 3, 2, ''),
(9, '', 1, 1, ''),
(10, '', 9, 0, '');
ALTER TABLE `administrator_menu`
ADD PRIMARY KEY (`id`);
ALTER TABLE `administrator_menu`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=11;
CREATE TABLE `administrator_menu_description` (
`id` int(11) NOT NULL,
`label` varchar(255) NOT NULL,
`language_id` int(11) NOT NULL DEFAULT '1'
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--
-- Dumping data for table `administrator_menu_description`
--
INSERT INTO `administrator_menu_description` (`id`, `label`, `language_id`) VALUES
(3, 'Accueil', 1),
(7, 'Administration', 1),
(7, 'Administration', 2),
(5, 'Catalog', 2),
(5, 'Catalogue', 1),
(1, 'Configuration', 1),
(1, 'Configuration', 2),
(10, 'Configuration générale', 1),
(10, 'general Configuration', 2),
(3, 'Index', 2),
(8, 'Index Catalogue', 1),
(8, 'Index Shop', 2),
(9, 'Ma boutique', 1),
(9, 'My shop', 2);
ALTER TABLE `administrator_menu_description`
ADD PRIMARY KEY (`id`,`language_id`),
ADD KEY `label` (`label`);
ALTER TABLE `administrator_menu_description`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=11;
脚本
sql请求的结果
table administrator_menu
id parent_id sort_order class
1 0 2
3 0 1
5 0 3
6 0 4
7 3 1
8 3 2
9 1 1
10 9 0
注意:
parent_id是为创建分层菜单而选择的id的数量
例如id = 10
和parent_id = 9
,我们处于3em级别
例如id = 9
和parent_id = 1
,我们处于2em级别
例如id = 1
和parent_id = 0
,我们处于第1级
table description menu
id lable language_id
1 Configuration 1
1 Configuration 2
3 Accueil 1
3 Index 2
5 Catalogue 1
5 Catalog 2
7 Administration 1
7 Administration 2
8 Index Catalogue 1
8 Index Shop 2
9 Ma boutique 1
9 My shop 2
10 Configuration générale 1
10 general Configuration 2
<?php
// Select all entries from the menu table
$Qmenus = $Db->prepare('SELECT a.id,
a.link,
a.parent_id,
a.class,
a.sort_order,
amd.label
FROM :table_administrator_menu a,
:table_administrator_menu_description amd
where a.id = amd.id
and amd.language_id = :language_id
ORDER BY a.parent_id,
a.sort_order
');
$Qmenus->bindInt(':language_id', $Language->getId());
$Qmenus->execute();
$Qmenus = $Qmenus->fetchAll();
?>
<!-- Navigation -->
<nav class="navbar navbar-default navbar-static-top" role="navigation" style="margin-bottom: 0">
<div class="navbar-default sidebar" role="navigation">
<div class="sidebar-nav navbar-collapse">
<ul class="nav" id="side-menu">
<?php
$menu_parent = array();
$menu_sub = array();
foreach ($Qmenus as $menus) {
if ($menus['parent_id'] == 0) {
$menu_parent[$menus['id']] = $menus;
} else {
if (isset($menu_parent[ $menus['parent_id']])) {
$menu_parent[$menus['parent_id']]['sub_menu'] = $menus['id'];
$menu_sub[$menus['id']] = $menus;
} else if (isset($menu_sub[$menus['parent_id']])) {
$menu_sub[$menus['parent_id']]['sub_menu'] = $menus['id'];
$menu_sub[$menus['id']] = $menus;
}
}
}
foreach($menu_parent as $key => $menus) {
echo '<li><a href="#"><i class="fa fa-sitemap fa-fw"></i>' . $menus['label'] . '<span class="fa arrow"></span></a>';
if (!empty($menus['sub_menu'])) {
echo '<ul class="nav nav-second-level">';
foreach($menu_sub[$menus['sub_menu']] as $sub_key => $submenus) {
echo '<li><a href="#">' . $submenus['label'] . '</a>';
if (!empty($submenus['sub_menu'])) {
foreach($menu_sub[$submenus['sub_menu']] as $sub2_key => $submenus2) {
echo '<li><a href="#">' . $submenus2['label'] . '</a>';
if (!empty($submenus2['sub_menu'])) {
foreach($menu_sub[$submenus2['sub_menu']] as $sub3_key => $submenus3) {
echo '<li><a href="#">' . $submenus3['label'] . '</a></li>';
}
}
echo '</li>';
}
}
echo '</li>';
}
echo '</ul>';
}
echo '</li>';
}
?>
</ul>
</div>
<!-- /.sidebar-collapse -->
</div>
<!-- /.navbar-static-side -->
</nav>
答案 0 :(得分:0)
您的代码只会生成两个级别的菜单,如果您需要通过任何级别,我认为您需要使用递归。
以下是基于数据库结构和示例的示例。在示例中,我们将生成不同级别的菜单,英文标签用于菜单项名称。
<?php
$db = new PDO('mysql:host=localhost;dbname=testdb', 'root', '');
function drawMenu($db, $parent, $level = null){
$m = $db->prepare(" SELECT * FROM
administrator_menu, administrator_menu_description
where administrator_menu.id = administrator_menu_description.id
and language_id = 2
and parent_id = $parent");
$m->execute();
foreach ($m->fetchAll() as $menu_row) {
$m = $db->prepare("SELECT count(*) FROM administrator_menu where parent_id = $menu_row[id]");
$m->execute();
// The item is parent, so do recursion again
if($m->fetchAll()[0][0] !== '0' && $level !== 0){
echo "<li>" . $menu_row['label']."<ul>";
drawMenu($db, $menu_row[0], $level - 1);
echo "</ul></li>";
}else{ // The item is a leaf or we reach the end level, i.e. base case, so do print the item label
echo "<li>" . $menu_row['label'] . "</li>";
}
}
}
?>
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<?php
echo "<div> <ul>";
drawMenu($db, 0, null); // all levels
echo "</ul></div>";
echo "--------------------------------------------------------";
echo "<div> <ul>";
drawMenu($db, 0, 0); // level 0
echo "</ul></div>";
echo "--------------------------------------------------------";
echo "<div> <ul>";
drawMenu($db, 0, 1); // level 1
echo "</ul></div>";
echo "--------------------------------------------------------";
echo "<div> <ul>";
drawMenu($db, 0, 2); // level 2
echo "</ul></div>";
?>
</body>
</html>
绘制所有级别:
echo "<div> <ul>";
drawMenu($db, 0, null); // all levels
echo "</ul></div>";
drawMenu
功能的工作原理如下:
$db
对象进行数据库查询,$parent
表示树将开始,$level
表示树的级别。$parent
的子项,然后为每个foreach ($m->fetchAll() as $menu_row) {...}
进行循环。在循环中我们有两种情况:
该项目是叶子,即不是其他项目的父项,或者我们到达树的最终级别。这种情况称为基本情况,其中递归将停止并返回值echo "<li>" . $menu_row['label'] . "</li>";
该项目是父项,在这种情况下,我们再次调用drawMenu
功能,项目ID为$menu_row[0]
作为父项$level - 1
,以确保在到达时停止等级结束。
测试代码并根据需要进行更改。