0

次のループは、アイテムを 2 つのグループにグループ化します。1 つの li 内の 5 つのアイテムの最初のグループと、次に 6 つのアイテムの各グループです。これを変更して、li の最初の 3 項目をグループ化し、次に li の各 5 項目をグループ化しようとしています。

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

次のように変更しようとしていますが、グループ化がうまくいきません (例: アイテムの数が間違っている、一部のアイテムが li に入らないなど)。

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

2 に答える 2

1

私があなたの望む出力を理解しているなら、あなたは次のようなものが欲しいです(<div>簡潔にするためにタグを無視します):

<li>item #1</li>
<li>item #2</li>
<li>item #3</li>
<li>
    item #4
    item #5
    item #6
    item #7
    item #8
</li>
... repeat

これが正しく、各「ルール」(ルールが「最初の3つ」と「次の5つ」)のアイテムの数が変わる可能性がある場合(ちょうどそうだったように)、それらを表すために作成された変数をお勧めします-そのように、将来的には、変数を変更するだけで、実際のコード変更について心配する必要はありません。

私がお勧めする最初の方法は、(半)完全な書き換えです。このメソッドは、if私がより読みやすく/管理しやすいと感じる方法で、一連のステートメントを使用します。

$firstGroupLength = 3;
$repeatedGroupLength = 5;

for ($i = 1; $i < 20; $i++) {
    if ($i <= $firstGroupLength) {
        echo '<li><div>item ' . $i . '</div></li>';
    } else {
        if ((($i - $firstGroupLength) % $repeatedGroupLength) == 1) {
            echo '<li>';
        }
        echo '<div>item ' . $i . '</div>';
        if ((($i - $firstGroupLength) % $repeatedGroupLength) == 0) {
            echo '</li>';
        }
    }
}
if ((($i - $firstGroupLength) % $repeatedGroupLength) != 1) {
    echo '</li>';
}

この方法は仕事を成し遂げますが、長い面でも大きな意味があります。ただし、将来いつでも、最初のグループを繰り返しグループとは異なる方法で表示したい場合、たとえば、CSSクラスやその他のランダムな機能が異なる場合は、このメソッドがテーブルに配置します。

三項演算子の方法を使い続けたい場合は、次の方法でも同様に機能するはずです。

$firstGroupLength = 3;
$repeatedGroupLength = 5;

echo '<li>';
for($i = 1; $i < 20; $i++) {

    echo ((($i % $repeatedGroupLength) == ($repeatedGroupLength - 1)) ? '<li>' : '')
        . '<div>item ' . $i . '</div>'
        . ((($i % $repeatedGroupLength) == $firstGroupLength) ? '</li>' : '');
}
if (($i % $repeatedGroupLength) != $firstGroupLength) echo '</li>';

これらの方法の両方で、$firstGroupLength変数が見つかります。これは、それ自体で繰り返されるアイテムの最初の「グループ」(など<li>item #</li>)に設定されます。2番目の変数$repeatedGroupLengthは、繰り返しの「アイテムグループ」ブロック(など<li>item # item # item #</li>)に表示される要素の数を設定します。

于 2012-11-08T13:40:43.527 に答える
1

これを試してください(編集済み):

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

少し変更したコード例

説明:

アイテムを 5 つのグループにグループ化したい場合は、5 で mod します。最初の 3 つのアイテムは特殊なケースですが、3 は 5 より小さいため、最初の 3 つの数字をメイン ループに組み込むことができます。

コードの問題は、s の追加にあります<li>$i0 ではなく 1から開始するため、$i % 5 == 4代わりにを使用する必要があり$i % 5 == 0ます。

于 2012-11-08T13:25:57.207 に答える