0

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

2 回答 2

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 ) {
于 2013-10-03T14:43:02.257 回答
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>在您的客户端列表末尾,而不管最后一组中剩余客户端的数量。

试试看...

于 2013-10-03T15:01:04.107 回答