2017-01-12 3 views
0

Ich bin durch meine DB-Ergebnisse durchlaufen und gebe sie in 3 Spalten. Das Endergebnis muss so sein:Durchschleifen von Elementen und Platzieren der Ergebnisse in 3 Spalten

<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> 

Die Anzahl der Elemente variiert von 1 bis über hundert. Hier ist meine Aufnahme:

$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++; 
} 

Es scheint irgendwo ein logischer Fehler zu sein. Es scheint die meiste Zeit zu funktionieren, aber es gibt Fälle, in denen das Div nicht geschlossen ist. Was vermisse ich?

Antwort

1

Sie können array_chunk verwenden, um Ihre $listArr in die erforderliche Anzahl an Chunks aufzuteilen. Danach können Sie sie mit implode verketten. Wenn Sie einige Objekte in Ihrem ursprünglichen Array haben, können Sie array_map verwenden, um die Eigenschaftswerte abzurufen, die Sie anzeigen möchten.

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>'; 
} 

Beantwortung der eigentlichen Frage, die Sie gefragt haben: Sie werden nie Interna dieser bedingten Anweisung erreichen:

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

Sie werden direkt aus der Schleife, bevor $count erreicht $total. Wenn Sie wirklich Ihre Lösung behalten möchten Sie es wie folgt festlegen:

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

oder durch $total vor Beginn der Schleife dekrementiert. Obwohl meiner Meinung nach die Lösung, die ich oben zur Verfügung gestellt habe, klarer sein sollte.

Verwandte Themen