PHP在循环中对项目进行分组

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.

Code Example

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

http://codepad.org/oxJloL03