2012-11-07 44 views
0

在一個循環中,我想包裝li中的前5個項目,然後在li中每6個項目。我正在嘗試下面的代碼,但它不能正常工作,它將前5個項目包裝在li中,之後它只包含li中的每六個項目,但是沒有li包含七個到十二個項目。PHP在一個循環中分組項目

$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>"; } 
+1

如果while()循環以$開始我++,你應該嘗試的()循環。 – George

回答

1

嘗試這種解決方案:

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>"; 

我試圖保持儘可能簡單。

Code Example

+0

謝謝,非常乾淨的代碼,我應該學習_this_ PHP :) – user1251698

+0

關閉主題,但爲什麼不應該在while循環中使用$ i ++?我在php.org和使用i ++的其他教程網站上找到了示例,並且無法在google上找到爲什麼不使用它。 – user1251698

+0

您試圖在最後一行到達$ i變量外循環。我認爲你應該把它的聲明放在循環之外。 – akhilless

1

這是因爲你的病情說$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>"; } 
+0

'$ i ++;'在for循環中? – iMoses

+0

對不起,重寫他的代碼時犯了一個錯誤。修正了它,非常感謝。 – akhilless

+0

謝謝,但問題是,19不是固定的數字,它可以是任何東西,所以我想包裹裏的每6項(前5項後)。 – user1251698

2

這裏更乾淨,易於閱讀的解決方案。

$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

相關問題