PHP导航菜单:按需在含子菜单的菜单项中添加指定Div
解决导航栏子菜单容器仅生成一次的问题
我来帮你搞定这个导航栏的子菜单结构问题!核心思路是先判断当前主菜单是否有对应的子菜单,再决定是否生成那三个容器div,且只生成一次,之后把所有子菜单项放到容器内部,而不是在子菜单循环里去判断生成div(那样会重复生成)。
具体实现步骤
- 先把子菜单按父菜单分组(提升查询效率,避免每次遍历所有子菜单)
- 循环主菜单,对每个主菜单检查是否存在对应的子菜单
- 有子菜单时:先输出主菜单的基础结构,接着一次性生成div1、div2、div3,再在容器内循环输出所有子菜单项
- 无子菜单时:直接输出普通主菜单项即可
完整代码示例
<?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
相关产品推荐
相关产品推荐

