PHP循环中每两个元素包裹DIV失效问题及解决方法
解决PHP循环中每两个元素包裹容器的问题(兼容奇数元素)
你现在的问题核心是循环里的容器开闭逻辑出错了——原代码在处理偶数元素时,关闭当前容器的同时又直接打开了一个新容器,这就导致后续元素被错误嵌套,加上收尾判断的小问题,才出现了多余的<div class="col-lg-12 col-md-12 col-sm-12">,进而影响Owl Carousel的正常渲染。
下面是修正后的代码,同时兼容奇数个元素的情况:
<?php $diensten = "SELECT * FROM snm_content WHERE catid = 9 AND state = 1 ORDER BY ordering"; $dienstencon = $conn->query($diensten); $tel = 0; // 改为从0开始计数,分组判断更直观 $dienstenslider = ''; while($diensten = $dienstencon->fetch_assoc()){ // 处理简介文本截断逻辑 if (strlen($diensten['introtext']) > 100){ $shortstr = substr($diensten['introtext'], 0, 100) . '...'; }else{ $shortstr = $diensten['introtext']; } // 每组第一个元素(第1、3、5...个)时,打开容器 if ($tel % 2 == 0) { $dienstenslider .= '<div class="col-lg-12 col-md-12 col-sm-12">'; } // 添加单个服务项的HTML内容 $dienstenslider .= ' <div class="col-lg-6 col-md-6 col-sm-12"> <div class="serv-item pull-left"> <p class="ser-tit"><i class="pe-7s-notebook"></i><a href="info/'.$diensten['alias'].'.html">'.$diensten['title'].'</a></p> <p class="ser-cont"> '.strip_tags($shortstr).' </p> <a href="info/'.$diensten['alias'].'.html" class="ser-read-more">Lees meer<i class="fa fa-angle-right"></i></a> </div> </div>'; // 每组第二个元素(第2、4、6...个)时,关闭容器 if ($tel % 2 == 1) { $dienstenslider .= '</div>'; } $tel++; } // 处理总元素数为奇数的情况:如果最后一组只有一个元素,补上闭合标签 if ($tel % 2 != 0) { $dienstenslider .= '</div>'; } echo $dienstenslider; ?>
关键改动说明:
- 计数变量调整:把
$tel从1改为0开始计数,这样$tel%2==0刚好对应每组的第一个元素,$tel%2==1对应每组的第二个元素,分组逻辑更清晰。 - 移除多余的容器打开逻辑:原代码在偶数元素时同时关闭并打开新容器,这会导致容器嵌套混乱,现在只在每组开头打开容器,结尾关闭,和Owl Carousel的
owl-item结构完美匹配。 - 优化收尾判断:循环结束后检查总元素数是否为奇数,确保最后一组只有一个元素时,容器能正常闭合,不会出现标签不匹配的问题。
这样修改后,生成的HTML会严格按照每两个服务项包裹一个目标容器的规则输出,不管元素总数是奇数还是偶数,都不会出现多余嵌套,Owl Carousel就能正常工作了。
内容的提问来源于stack exchange,提问作者twan
相关产品推荐
相关产品推荐

