Открывать и закрывать блок, для каждых четырех пунктов

335
09 февраля 2017, 03:12

Здравствуйте. Есть разметка, вида:

<div class="row-4">
    тут 4 пункта из базы
</div>
<div class="row-4">
    тут 4 пункта из базы
</div>

В базе неопределенное кол-во пунктов, мне нужно, что перед каждым четвертым первым пунктом открывался блок <div class="row-4"> а после 4 пункта, закрывался </div>.

Еще нужно учесть что в последнем блоке может быть пунктов меньше чем 4.

Я пытался вот так:

<? $sp = 0;
$table_all = mysql_query("SELECT * FROM `table` ORDER BY `id` DESC");
    while ($table = mysql_fetch_assoc($table_all)) {
        $sp++;
    ?>
<? if ($sp == 4) { ?> <div class="row-4"> <? } ?>
    <div>
        <input type="checkbox" class="checkbox" id="checkbox-<?=$table['id'];?>" name="<?=$table['id'];?>" />
        <label for="checkbox-<?=$table['id'];?>"><?=$table['name'];?></label>
    </div>
<? if ($sp == 4) { ?> </div> <? $sp = 0; } ?>
<? } ?>

Но что-то я путаю видимо. Буду благодарен за помощь.

Answer 1

Самое простое - подготовить view нужной структуры во время получения данных из базы.

<?php
 $view = array();
 $row = array();
 while ($item = mysql_fetch_assoc($table_all)) {
    if (count($row) == 4) {
      $view[] = $row;
      $row = array();
    }
    $row[] = $item;
 }
 if ($row) {
  $view[] = $row;
 }
?>
<?foreach($view as $row):?>
  <!-- Render row -->
  <?foreach($row as $item):?>
    <!-- Render item -->
  <?endforeach?>
<?endforeach?>

Если наличие </tag><tag> в темплейте не смущает, можно так:

$index = 0;
echo '<div class="row">';
while ($item = mysql_fetch_assoc($table_all)):
  if (($index+1)%4 == 0) echo '</div><div class="row">';
  // render item
  $index++;
endwhile;
echo '</div>';
Answer 2

Выбриаете все данные в массив, массив разбиваете на части с помощью array_chunk

<?php
$table_all = mysql_query("SELECT * FROM `table` ORDER BY `id` DESC");
$data = array();
while ($table = mysql_fetch_assoc($table_all)) {
    $data[] = $table;
}
$data = array_chunk($data, 4);
?>
<?php foreach ($data as $chunk): ?>
    <div class="row-4">
    <?php foreach ($chunk as $table):?>
        <div>
        <label>
            <input type="checkbox" class="checkbox" name="<?=$table['id'];?>" />
            <?=$table['name'];?>
        </label>
        <div>
    <?php endforeach;?>
    </div>
<?php endforeach;?>

Кстати, конструкция <label><input type="checkbox" /> Название чекбокса</label> позволяет не задавать ID для элементов, а задавать числовые имена для полей ввода - дурной тон.

Answer 3
$code;
$out = array();
$tag_start = '<div class=\'row-4\'>';
$tag_end = '</div>';
while(++$i < 100){
    $code .= $i.' ';//Сюда - заполняем пункты нужные, как бы рендерили в хтмл
    if($i % 4 == 0){
        $out[] = $code;
        $code = '';
    }
}
if($code){//Если мы не обнуляли код в последней итерации(она была меньше 4х)
    $out[] = $code;//делаем это сейчас
}
echo 
    $tag_start.
    implode(
        $tag_end.
        $tag_start,
        $out
        ).
    $tag_end;

Пример в сендбоксе

READ ALSO
Каким образом не учитывать регистр при выборке из базы

Каким образом не учитывать регистр при выборке из базы

Есть строка с текстомИ есть таблица в базе данных MySQL, в этой таблице записаны некоторые слова

287
Не строит дерево категорий

Не строит дерево категорий

Всем привет, у меня возникла проблема при выборе дерева категорийВот запрос, который я посылаю

274
Как изменить welcome.blade.php через форму в admin panel?

Как изменить welcome.blade.php через форму в admin panel?

Хочу добавить фичу на свой сайт

266
Использование use

Использование use

Допустим, есть класс Mysql который должен быть в пространстве lib

309