循环遍历项目并将结果放在3列中

时间:2017-01-12 17:01:45

标签: php

我正在遍历我的数据库结果并将它们输出为3列。最终结果必须是这样的:

<div class="col-xs-12 col-md-4">
   Item<br>
   Item<br>
</div>
<div class="col-xs-12 col-md-4">
   Item<br>
   Item<br>
</div>
<div class="col-xs-12 col-md-4">
   Item<br>
</div>

项目数量从1到超过100。以下是我拍摄的照片:

$total = count($listArr);
$coln1 = ceil($total / 3);
$coln2 = $coln1 * 2;
$count = 0;

foreach ($listArr AS $lst) {

    if ($count == 0) {
        echo '
        <div class="col-xs-12 col-md-4">';
    } elseif(($count == $coln1 || $count == $coln2) && $count > 1) {
        echo '
        </div>
        <div class="col-xs-12 col-md-4">';
    }

    echo $lst->item;

    if ($count == $total) {
        echo '
        </div>';
    }

    $count++;
}

某处似乎存在逻辑错误。它似乎大部分时间都有效,但有些情况下div没有关闭。我错过了什么?

1 个答案:

答案 0 :(得分:1)

您可以使用array_chunk$listArr拆分为所需数量的块。之后,您可以将它们与implode连接起来。 假设您的初始数组中有某种对象,则可以使用array_map来检索要显示的属性值。

foreach (array_chunk($listArr, 3) as $chunk) {
    echo '<div class="col-xs-12 col-md-4">',
        implode(
            '<br>',
            array_map(
                function ($list) {
                    return $list->item;
                },
                $chunk
            )
        ),
        '</div>';
}

回答您提出的实际问题:您永远不会达到此条件声明的内幕:

if ($count == $total) {
    echo '
    </div>';
}

$count到达$total之前,您将处于循环之外。 如果你真的想保留你的解决方案,你可以这样解决:

if ($count == $total - 1) {
    echo '
    </div>';
}

或在循环开始之前递减$total。虽然在我看来我上面提供的解决方案应该更清楚。