PHP-группировка элементов в цикле

В цикле я хочу обернуть первые 5 элементов в li , а после этого каждые 6 элементов в li . Я пытаюсь выполнить код, но он работает неправильно, он обертывает первые 5 элементов в li , и после этого он обертывает только каждый шестой элемент в li, но 7-12-й без ли.

 $i = 0; while ($i < 19){ $i++; if($i == 1 ){ echo '<li>'; } if (($i > 5) AND ( $i % 6 == 0)){echo "<li>";} echo "<div>item " . $i . "</div>"; if( $i == 5 ){ echo '</li>'; } if(($i > 5) AND ( $i % 6 == 0)) { echo "</li>"; } } if ($i < 5 ) { echo "</li>"; } if (($i > 5) AND ($i % 6 != 0)) { echo "</li>"; } 

Попробуйте это решение:

 for ($i = 1; $i < 20; $i++) { echo ($i === 1 || $i % 6 === 0) ? "<li>" : null, "<div>item {$i}</div>", ($i % 6 === 5) ? "</li>" : null; } if ($i % 6 !== 0) echo "</li>"; 

Я старался держать его как можно проще.

Пример кода

Здесь более чистое и легко читаемое решение.

 $i = 0; $group = 0; $group_by = 5; while ($i < 19){ $i++; if ($group == 0) {//new group start echo "<li>"; } echo "<div>item " . $i . "</div>"; $group++; if ($group == $group_by) {//end of group echo "</li>\n"; $group = 0; $group_by = 6; } } if ($group != 0) { echo "</li>"; }//end group if it was not closed 

http://codepad.org/oxJloL03

Это потому, что ваше состояние говорит $i % 6 == 0 что означает «каждый шестой элемент», а не 6 элементов.

Чтобы обернуть 6 последовательных элементов, т. Е. От 7 до 12, вы должны переписать свое условие на $i <= 12 , чтобы ваш код стал:

 $i = 0; for (; $i < 19; $i++) { if($i == 1 ){ echo '<li>'; } if (($i > 5) AND ( $i <= 12)){echo "<li>";} echo "<div>item " . $i . "</div>"; if( $i == 5 ){ echo '</li>'; } if(($i > 5) AND ( $i <= 12)) { echo "</li>"; } } if ($i < 5 ) { echo "</li>"; } if (($i > 5) AND ($i <= 12)) { echo "</li>"; }