每X次迭代打开/关闭li(或html元素)

时间:2013-10-03 14:31:10

标签: php html

我有一个我要循环的项目(客户端)列表, 但我希望每个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;
}

2 个答案:

答案 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,不管最后一组中剩余客户端的数量。

试试吧......