2017-01-12 98 views
0

我循環訪問我的數據庫結果並將它們輸出爲3列。最終結果需要如下:循環遍歷項目並將結果放在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

您可以使用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。雖然我認爲上面提供的解決方案應該更清楚。