php - Nuevo que contiene div después de cada 3 registros
html if-statement (3)
Me gustaría crear un nuevo que contenga
<div>
después de 3 resultados, usando el bucle de resultados PDO.
Para mi proyecto de autoestudio, tengo que hacer una página de producto con bootstrap y después de cada 3er registro tengo que hacer una nueva fila y mostrar nuevamente 3 col-md-4, etc., etc.
Ahora tengo esto como mi código:
<div class="row">
<?php
while ($row = $stmt->fetch(PDO::FETCH_OBJ)) {
?>
<div class="col-md-4">
<div class="product">
<div class="title"><?php echo $row->pname ?></div>
<div class="img"><img
src="../product/img/<?php echo $row->pnumber ?>/<?php echo $row->pthumbnail ?>.jpg?$pop210x210$"/>
</div>
<div class="vijftien"></div>
<div class="deliver">Levertijd: <strong><?php echo $row->pdelivertime ?></strong></div>
<div class="vijf"></div>
<div class="other"></div>
<div class="row">
<div class="col-md-6">
<div class="price"><?php echo $row->pprice ?></div>
</div>
<div class="col-md-6">
<div class="order">
<button class="log_in" id="doLogin">Meer informatie</button>
</div>
</div>
</div>
</div>
</div>
<?php } ?>
</div>
He visitado y estudiado otras preguntas, pero realmente no entiendo cómo lo están haciendo y cómo puedo implementar el método correcto en mi código.
$ x = 0; eco "";
foreach ($ filas como $ fila) {/ * agregó una condición más para eliminar el div vacío ... * /
if ($x != 0 && $x % 3 == 0 && $x < count($rows))
{
echo "</div>/n<div class=''row''>";
}
echo "<div>$row</div>";
++$x;
}
eco "";
Como dijo tadman en el comentario debajo de su pregunta.
El mejor enfoque debe usar un
operador de módulo
(
%
) con
3
.
Coloque su condición de separación al comienzo de cada iteración. ( Demo )
Me gusta esto:
$x=0; // I prefer to increment starting from zero.
// This way I can use the same method inside a foreach loop on
// zero-indexed arrays, leveraging the keys, and omit the `++` line.
echo "<div class=/"row/">";
foreach($rows as $row){
if($x!=0 && $x%3==0){ // if not first iteration and iteration divided by 3 has no remainder...
echo "</div>/n<div class=''row''>";
}
echo "<div>$row</div>";
++$x;
}
echo "</div>";
Esto creará:
<div class="row"><div>one</div><div>two</div><div>three</div></div>
<div class=''row''><div>four</div><div>five</div><div>six</div></div>
Edición tardía, aquí hay otros métodos para situaciones similares que proporcionarán el mismo resultado:
foreach(array_chunk($rows,3) as $a){
echo "<div class=/"row/"><div>",implode(''</div><div>'',$a),"</div></div>/n";
}
o
foreach ($rows as $i=>$v){
if($i%3==0){
if($i!=0){
echo "</div>/n";
}
echo "<div class=/"row/">";
}
echo "<div>$v</div>";
}
echo "</div>";
Para aclarar qué NO hacer ...
La respuesta de Sinan Ulker conducirá a un resultado no deseado dependiendo del tamaño de su matriz de resultados.
Aquí hay un ejemplo generalizado para exponer el problema:
Usando esta matriz de entrada para representar sus resultados de pdo:
$rows=["one","two","three","four","five","six"];
Condición de Sinan al final de cada iteración:
$i=1;
echo "<div class=/"row/">";
foreach($rows as $row){
echo "<div>$row</div>";
if($i%3==0)echo "</div>/n<div class=''row''>"; // 6%3==0 and that''s not good here
// 6%3==0 and will echo the close/open line after the content to create an empty, unwanted dom element
$i++;
}
echo "</div>/n/n";
Creará esto:
<div class="row"><div>one</div><div>two</div><div>three</div></div>
<div class=''row''><div>four</div><div>five</div><div>six</div></div>
<div class=''row''></div> //<--- this extra element is not good
Debe agregar una nueva etiqueta de cierre y abrir una nueva cada 3ra iteración.
<div class="row">
<?php
$sql = "SELECT * FROM products";
$stmt = $conn->query($sql);
$stmt->execute();
$i=1;
while ($row = $stmt->fetch(PDO::FETCH_OBJ)) {
?>
<div class="col-md-4">
<div class="product">
<div class="title"><?php echo $row->pname ?></div>
<div class="img"><img
src="../product/img/<?php echo $row->pnumber ?>/<?php echo $row->pthumbnail ?>.jpg?$pop210x210$"/>
</div>
<div class="vijftien"></div>
<div class="deliver">Levertijd: <strong><?php echo $row->pdelivertime ?></strong>
</div>
<div class="vijf"></div>
<div class="other"></div>
<div class="row">
<div class="col-md-6">
<div class="price"><?php echo $row->pprice ?></div>
</div>
<div class="col-md-6">
<div class="order">
<button class="log_in" id="doLogin">Meer informatie</button>
</div>
</div>
</div>
</div>
</div>
<?php
if($i%3==0)echo "</div><div class=''row''>";
$i++;
} ?>