0

以下循环将项目分为两组:第一组 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,某些项目没有进入 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

试试这个(编辑):

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 取模。前三个项目是一种特殊情况,但由于 3 小于 5,我们可以将前三个数字合并到我们的主循环中。

您的代码的问题在于添加<li>s. 由于我们从$i1 而不是 0 开始,我们应该使用$i % 5 == 4而不是$i % 5 == 0.

于 2012-11-08T13:25:57.207 回答
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

如果这是正确的,并且每个“规则”(规则是“前三个”和“后五个”)中的项目数可能会改变(就像他们刚刚所做的那样),我会建议创建变量来表示它们 - 这样,在将来,您只需要更改变量,而不必担心进行实际的代码更改。

我推荐的第一种方法是(半)完全重写。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>)。第二个变量$repeatedGroupLength将设置在重复的“项目组”块中显示的元素数量(例如<li>item # item # item #</li>)。

于 2012-11-08T13:40:43.527 回答