gpt4 book ai didi

php - 分层树形菜单 - PHP/MySQL

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

在使用 CRUD 处理动态菜单时,我在收尾时遇到了一些麻烦。它有效,但有一些额外的标签被插入到不应该插入的地方,并且在我与世界分享之前无法弄清楚如何清理它。我以此为起点,然后将其更改为使用 Accordion 菜单 ( http://www.phpro.org/tutorials/Simple-Mysql-PHP-Menu.html )。

下面是表中的数据(我更改了前 2 个字段的名称以使其适合 SO 格式,从 menu_item_id 到 id,从 menu_parent_id 到 pid)。

id  pid    menu_item_name         menu_url  sortorder status 
1 0 Settings 0 ACTIVE
2 5 Grid Demo grid.php ACTIVE
3 5 setGridOptions gridoptions.php ACTIVE
4 1 Menu Items adminmenu.php 1 ACTIVE
5 0 Grid Settings 100 ACTIVE
6 1 General Settings settings.php 100 ACTIVE

这是连接到 mysql 数据库并创建分层树数组以使其工作的 PHP:

include 'db.php';
$sql = "SELECT * FROM menu_items WHERE status = \"ACTIVE\" ORDER BY sortorder, menu_item_name";
$query = $db->query($sql);


while($data = $query->fetch(PDO::FETCH_ASSOC))
// loop over the results
{
// Assign by reference
$thisref = &$refs[ $data['menu_item_id'] ];

// add the the menu parent
$thisref['menu_item_id'] = $data['menu_item_id'];
$thisref['menu_parent_id'] = $data['menu_parent_id'];
$thisref['menu_item_name'] = $data['menu_item_name'];
$thisref['menu_url'] = $data['menu_url'];

// if there is no parent id
if ($data['menu_parent_id'] == 0)
{
$list[ $data['menu_item_id'] ] = &$thisref;
}
else
{
$refs[ $data['menu_parent_id'] ]['children'][ $data['menu_item_id'] ] = &$thisref;
}
}

function create_list( $arr )
{
$html = "";
foreach ($arr as $key=>$v)
{
if ($v['menu_parent_id'] == '0')
{
$html .= '<a class="menuitem submenuheader" href="'. $v['menu_url'] .'">'.$v['menu_item_name']."</a>\n";
$html .= "<div class=\"submenu\">\n<ul>\n";
$html .= "<li>" . create_list($v['children']) . "</li>";
$html .= "</ul>\n";
}
else{
$html .= '<li><a id="' . $v['menu_item_id'] . '">'.$v['menu_item_name']."</a></li>\n";
}
}
$html .= "</div>\n";
return $html;
}
echo "<div class=\"glossymenu\">";
echo create_list( $list );
echo "</div>";

当我运行它时,它会输出以下内容:

<div class="glossymenu"><a class="menuitem submenuheader">Settings</a>
<div class="submenu">
<ul>
<li><li><a id="4">Menu Items</a></li>
<li><a id="6">General Settings</a></li>
</div>
</li></ul>
<a class="menuitem submenuheader" href="">Grid Settings</a>
<div class="submenu">
<ul>
<li><li><a id="2">Grid Demo</a></li>
<li><a id="3">setGridOptions</a></li>
</div>
</li></ul>
</div>
</div>

如您所见,还有额外的 <li>标签,</ul>错了spot(应该在 </div> 之后)除此之外,它运行良好。

另一件我想不通的事情是,如果我有一个没有子项的根菜单项,我希望它有不同的输出,比如

<a id="8">No Children Menu Item</a>
Instead of:
<a class="menuitem submenuheader">No Children Menu Item</a>

第二个示例将创建使其显示用于扩展和收缩的小 (+/-),并且不允许我单击它。有关 <a> 的说明标签,我正在使用 javascript 执行基于 id 的 .get(),这就是没有显示 href 或 url 的原因。

更新

它工作正常,我将它发布在 Github 上,供任何需要它的人使用。 https://github.com/ajhalls/php-accordian-menu

最佳答案

试试这个:

<?php
include 'db.php';

$sql = "SELECT * FROM menu_items WHERE status = 'ACTIVE' ORDER BY pid ASC, sortorder ASC, menu_item_name ASC";
$query = $db->query($sql);

$menu_items = array();

while($data = $query->fetch(PDO::FETCH_ASSOC)) {
if($data['pid'] == 0) {
$menu_items[$data['id']] = array();
$menu_items[$data['id']]['id'] = $data['id'];
$menu_items[$data['id']]['name'] = $data['menu_item_name'];
$menu_items[$data['id']]['url'] = $data['menu_url'];
$menu_items[$data['id']]['children'] = array();
} else if($data['pid'] != 0) {
$tmp = array();
$tmp['id'] = $data['id'];
$tmp['name'] = $data['menu_item_name'];
$tmp['url'] = $data['menu_url'];

array_push($menu_items[$data['pid']]['children'],$tmp);
unset($tmp);
}
}

function create_list($arr)
{
$html = "";
foreach($arr as $key => $value) {
if(count($value['children']) > 0) {
$html .= ' <a class="menuitem submenuheader" href="'. $value['url'] .'">'.$value['name'].'</a>
<div class="submenu">
<ul>';

foreach($value['children'] AS $child) {
$html .= ' <li>
<a id="'.$child['id'].'">'.$child['name'].'</a>
</li>';
}

$html .= ' </ul>
</div>';
} else{
$html .= ' <a id="'.$value['id'].'">'.$value['name'].'</a>';
}
}

return $html;
}

echo "<div class=\"glossymenu\">";
echo create_list($menu_items);
echo "</div>";
?>

关于php - 分层树形菜单 - PHP/MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23416692/

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