我有一个我要循环的项目(客户端)列表,
但我希望每个5都在<li>
标签中,如果最后一个标签少于5(例如2),它会自动关闭。
我做了以下代码,但是如何优化它,尤其是最后一部分?
foreach ($clients AS $k=>$client){
$liopen ='';
if ($k % 5 == 0){
echo "<li>\n";
$liopen = true; // we have an opened an li tag
}
echo '<div class="item" style="background:url('.$client['image'].') center center no-repeat;"></div>'."\n";
if ( $k == 4 || $k == 9 || $k == 14 || $k == 19 || $k == 24 || $k == 29 || $k == 34 || $k == 39 || $k == 44 || $k == 49 || $k == 54 || $k == 59 || $k == 64 || $k == 69 ){
echo "</li>\n";
$liopen = false;
}
}
if ($liopen == true) { // if an li tag is still open , close it
echo "</li>\n";
$liopen = false;
}
答案 0 :(得分:3)
我认为你的<li>
元素以这种方式分解是有点奇怪,因为在不同组中的客户之间似乎没有任何语义差异...我可能会把每个客户端在<li>
然后使用css做任何你想用分组完成的事情......但这不是真正的问题。
要按照您的方式执行操作,您可以使用array_chunk
将客户端分成5组(或最后一组):
$groups = array_chunk($clients, 5);
foreach ($groups as $group) {
echo "<li>\n";
foreach ($group as $client) {
echo '<div class="item" style="background:url('.$client['image'].') center center no-repeat;"></div>'."\n";
}
echo "</li>\n";
}
同样:如果您决定坚持使用您的实现,您可以使用模块化算法(就像您对$k % 5 == 0
所做的那样)来处理其他情况。所以这一行:
if ( $k == 4 || $k == 9 || $k == 14 || $k == 19 || ...
可以替换为
if ( $k % 5 == 4 ) {
答案 1 :(得分:0)
使用以下内容替换 -
foreach ($clients AS $k=>$client)
{
if ($k % 5 == 0)
echo "<li><br>";
echo '<div class="item" style="background:url('.$client['image'].') center center no-repeat;"></div>'."<br>";
}
echo "</li>";
这样做会有效,因为<li>
标记的打开会自动关闭之前的<li>
代码,因此您在客户端结尾时基本上只需要一个</li>
> -list,不管最后一组中剩余客户端的数量。