PHP:将项目分组为循环

时间:2012-11-08 13:03:48

标签: php loops

以下循环将项目分为两组:第一组,每组5个项目,然后每组6个项目。我正在尝试对此进行修改,以便对li中的前3个项目进行分组,然后对li中的每个项目进行分组。

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

2 个答案:

答案 0 :(得分: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>";

Code example with slight changes

说明:

如果你想将5个组中的项目分组,那么mod为5.前三个项目是特殊情况,但由于3小于5,我们可以将前三个数字合并到主循环中。

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

答案 1 :(得分: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>)中显示的元素数量。