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

PHP导航菜单:按需在含子菜单的菜单项中添加指定Div

解决导航栏子菜单容器仅生成一次的问题

我来帮你搞定这个导航栏的子菜单结构问题!核心思路是先判断当前主菜单是否有对应的子菜单,再决定是否生成那三个容器div,且只生成一次,之后把所有子菜单项放到容器内部,而不是在子菜单循环里去判断生成div(那样会重复生成)。

具体实现步骤

  1. 先把子菜单按父菜单分组(提升查询效率,避免每次遍历所有子菜单)
  2. 循环主菜单,对每个主菜单检查是否存在对应的子菜单
  3. 有子菜单时:先输出主菜单的基础结构,接着一次性生成div1、div2、div3,再在容器内循环输出所有子菜单项
  4. 无子菜单时:直接输出普通主菜单项即可

完整代码示例

<?php
// 第一步:把子菜单按父菜单标题分组,方便快速查找对应子菜单
$submenuGrouped = [];
foreach($submenu as $sub) {
    $submenuGrouped[$sub["parentmenu"]][] = $sub;
}
?>

<!-- 导航栏主菜单循环 -->
<ul class="main-menu">
    <?php foreach($menu as $men): ?>
        <?php if(isset($submenuGrouped[$men["titre"]])): ?>
            <!-- 有子菜单的菜单项:先输出主菜单链接,再生成容器div -->
            <li class="Menu has-submenu">
                <a href="<?php echo $men["url"] ?? '#'; ?>"><?php echo $men["titre"]; ?></a>
                <div class="div1">
                    <div class="div2">
                        <div class="div3">
                            <ul class="sub-menu">
                                <?php foreach($submenuGrouped[$men["titre"]] as $sub): ?>
                                    <li><a href="<?php echo $sub["url"]; ?>"><?php echo $sub["titre"]; ?></a></li>
                                <?php endforeach; ?>
                            </ul>
                        </div>
                    </div>
                </div>
            </li>
        <?php else: ?>
            <!-- 没有子菜单的普通菜单项 -->
            <li class="Menu">
                <a href="<?php echo $men["url"]; ?>"><?php echo $men["titre"]; ?></a>
            </li>
        <?php endif; ?>
    <?php endforeach; ?>
</ul>

逻辑说明

  • 分组子菜单后,我们可以通过$men["titre"]直接找到对应的所有子菜单项,不用每次遍历整个$submenu数组,性能更好。
  • 容器div(div1、div2、div3)只在主菜单存在子菜单时生成一次,之后所有子菜单项都会被包裹在这个容器里,完全符合你要的结构。
  • 原来的问题是把判断放在子菜单循环内部,导致每个子项都可能触发div生成,现在把判断移到主菜单循环里,从根源上避免了重复生成容器的问题。

内容的提问来源于stack exchange,提问作者prc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:37:56