Проблема с циклом в PHP

У меня есть структура разметки, как показано ниже:

<div> <div>value1</div> <div>value2</div> <div>value3</div> <div>value4</div> <div class="clear"></div> </div> <div> <div>value5</div> <div>value6</div> <div>value7</div> <div>value8</div> <div class="clear"></div> </div> 

У меня есть данные в наборе результатов PHP, скажем, у меня 9 записей, поэтому структура должна быть такой:

 <div> <div>value1</div> <div>value2</div> <div>value3</div> <div>value4</div> <div class="clear"></div> </div> <div> <div>value5</div> <div>value6</div> <div>value7</div> <div>value8</div> <div class="clear"></div> </div> <div> <div>value9</div> <div class="clear"></div> </div> 

Таким образом, цикл while должен работать таким образом, чтобы он печатал родительский div после успешной записи 4 записей. Но выше у меня есть 9 записей, поэтому он должен закрыть погружение, если его последняя запись.

Пожалуйста, помогите, спасибо!

Предварительно …

 <?php $num_of_results = sizeof($your_array); $loops = ceil($num_of_results/4); $k = 0; ?> 

В вашей сети

 <?php for($p = 0; $p < $loops; $p++) { ?> <div> <div> <?php for($i = 0; $i < 4 && $k < $num_of_results; $i++) { ?> <div><?php echo $your_array[$k]; $k++;?></div> <?php } ?> <div class="clear"></div> </div> </div> <?php } ?> 

Это ваша проблема, не так ли?

Получив некоторую идею из логики, приведенной здесь, я пробовал следовать, и это работает.

 <div> <!-- started main div --> <?php $icount = 1; $itotal = mysql_num_rows($result_rs); while ($rs = mysql_fetch_array($result_rs)) { echo '<div>'.$rs['value'].'</div>'; if ($icount % 4 == 0 && $icount != $itotal){ echo '<div class="clear"></div>'; echo '</div>'; //closed main div echo '<div>'; //started new main div } $icount++; } ?> </div> <!-- closed main div --> 

Это решило мою проблему.

Отредактировано: добавлено itotal condition, поэтому, когда у вас будет только 4 записи на страницу, это также будет работать правильно.

Хорошо, теперь я знаю, что тебе нужно. Я делал это раньше, когда показываю элементы в сетке, и вам нужно сломать каждую строку из-за этого браузера.

Во всяком случае, это уродливо, но я не думаю, что это становится легче, чем это

 <?php for ($i = 0, $total = count($resultSet); $i < $total; $i += 4) : ?> <div> <?php for ($j = $i; $j < ($i + 4); $j++) : if (!isset($resultSet[$j])) : ?> <div class="clear"></div> </div> <?php break 2; endif ?> <div><?php echo htmlspecialchars($resultSet[$j]) ?></div> <?php endfor ?> <div class="clear"></div> </div> <?php endfor ?> 
 <div> <?php for ($i = 1; $i <= 9; $i++): ?> <?php if ($i%4 == 1 && $i != 1): ?> <div class="clear"></div> </div> <div> <?php endif; //$i%4 == 1 && $i != 1 ?> <div>Value <?php echo $i ?></div> <?php endfor; //$i = 1; $i <= 9; $i++ ?> <div class="clear"></div> </div> 

или с массивом:

 <div> <?php foreach ($arr as $k=>$v): ?> <?php if (($k+1)%4 == 1 && $k != 0): ?> <div class="clear"></div> </div> <div> <?php endif; //($k+1)%4 == 1 && $k != 0 ?> <div><?php echo $v ?></div> <?php endforeach; //$arr as $k=>$v ?> <div class="clear"></div> </div> 

или с набором результатов mysqli:

 <div> <?php $count = 1 ?> <?php while ($row = mysqli_fetch_array($result)): ?> <?php if ($count%4 == 1 && $count != 1): ?> <div class="clear"></div> </div> <div> <?php endif; //$count%4 == 1 && $count != 1 ?> <div><?php echo $row['value'] ?></div> <?php $count++ ?> <?php endwhile; ?> <div class="clear"></div> </div> 

Почему бы не использовать modulo для «закрытия» div?

 <div> <?php foreach($data as $key => $value) : ?> <div><?php echo $value ?></div> <?php if($key % 4 == 0 && $key != 0) : // add a clearing div, close the first group and open another one ?> <div class="clear"></div> </div> <div> <? endforeach ?> <?php if($key % 4 != 0) : // div has not been closed as the number of records % 4 was not equal 0 ?> <div class="clear"></div> </div> <? endif ?>