PHP从数据库生成3级嵌套菜单时子菜单项缺失问题排查
项目背景
我创建了一个用于存储3级菜单(包含2层级子菜单)信息的数据库,可实现左侧交互菜单效果。
数据库表结构
menu表结构如下:
菜单生成PHP代码
<?php $req = $DB->query("SELECT * FROM menu ORDER BY ordered"); foreach ($req as $r) { if($r->level == 1) { $tab[$r->ordered] = array($r->id,$r->name,$r->class,$r->icon); } elseif ($r->level == 2) { $tab[$r->parent][4][$r->ordered] = array($r->id,$r->name); } elseif ($r->level == 3) { $tab[$r->cat][4][$r->parent][2][$r->ordered] = array($r->id,$r->name); } } foreach ($tab as $key => $value) { ?> <li data-menu="<?= $value[0]; ?>" class="<?= $value[2]; ?> menu-item"> <span class="material-icons-outlined"><?= $value[3]; ?></span> <span class="titre_menu"> <?= $value[1]; ?></span> <ul id="sub_menu<?= $value[0]; ?>" class="box_sub_exp <?= $value[2]; ?>"> <?php foreach ($value[4] as $ke => $val) { // SUB MENU POSITION 4 ?> <li class="<?= $value[2]; ?> submenu-item"><a href="page.php?=<?= $val[0]; ?>"><?= $val[1]; ?></a> <?php if(!empty($val[2])) { // IS A MENU IN POSITION 2 ?> <ul class="box_sub_sub_exp"> <?php foreach ($val[2] as $k => $v) { // SUB MENU POSITION 2 ?> <li class="<?= $value[2]; ?> submenu-item"><a href="page.php?=<?= $v[0]; ?>"><?= $v[1]; ?></a></li> <?php } ?> </ul> <?php } ?> </li> <?php } ?> </ul> </li> <?php } ?> </ul> </nav> </section>
问题描述
当前菜单渲染存在问题:一级子菜单显示完全正常,但二级子菜单会缺失首行数据,三级子菜单会缺失前2行数据,以此类推。
修复方案
问题根源并不在循环逻辑,而是SQL查询的排序规则错误,原SQL使用ORDER BY ordered排序,改为ORDER BY id排序即可解决问题。
内容的提问来源于stack exchange,提问作者Themiller
相关产品推荐
相关产品推荐

