gpt4 book ai didi

php - 动态菜单 php bootstrap mysql

转载 作者:行者123 更新时间:2023-11-29 20:05:20 25 4
gpt4 key购买 nike

我的这段代码有问题,我可以有第一级,在第二级我有一个 ID 号,而 3eme 级什么都没有。

我需要查找 4 个深度级别的信息

代码还会产生错误:此行上存在非法字符串偏移“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 = 10parent_id = 9 ,我们处于 3em 级别
例如 id = 9parent_id = 1 ,我们处于 2em 级别
例如 id = 1parent_id = 0 ,我们位于第一层

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>

最佳答案

你的代码只会生成两级菜单,如果你需要经历任何你想要的级别,我认为你需要使用递归。

这是一个基于您的数据库结构和示例的示例。在示例中我们将生成一个不同级别的菜单,菜单项名称使用英文标签。

<?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该树将以 and $level 开头用于树的级别。
  • 该函数将首先选择给定 $parent 的子代。并循环遍历每个 foreach ($m->fetchAll() as $menu_row) {...} .
  • 在循环中我们有两种情况:

    1. 该项目是叶子,即不是其他项目的父级,或者我们到达树的最终级别。这种情况称为基本情况,其中递归将停止并返回值 echo "<li>" . $menu_row['label'] . "</li>";

    2. 该项是父项,在本例中我们称为 drawMenu再次使用项目 ID $menu_row[0] 运行作为家长和$level - 1确保到达关卡末尾时停止。

测试代码并更改它以满足您的需求。

关于php - 动态菜单 php bootstrap mysql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40365952/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com