In a loop, I want to wrap first 5 items in a li
, and after that every 6 items in a li
. I'm trying following code, but it is not working properly, it wraps first 5 items in a li
, and after that it wraps only every sixth item in the li, but 7th - 12th without li.
$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>"; }
Try this solution:
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've tried to keep it as simple as possible.
This is because your condition says $i % 6 == 0
which means 'every sixth item', not 6 items.
To wrap 6 consecutive elements , i.e. from 7 to 12, you should rewrite your condition to $i <= 12
, so that your code becomes:
$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>"; }
Here more clean and easy to read solution.
$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>
";
$group = 0;
$group_by = 6;
}
}
if ($group != 0) { echo "</li>"; }//end group if it was not closed