You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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">&nbsp;<?= $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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 23:54:03