PHP: 如何将 foreach 循环分成 3 个部分?

PHP: How can I split a foreach-loop into 3 parts?

我的网站有点问题。我有一个博客,每篇文章都在一个列表中。现在我想把这个列表分成 3 个列表。

我的问题:

<ul class="row-3">
<?php $i = 1; foreach($posts as $post): ?>
    <?php if($i % 3 == 0): ?>
        <?php echo "$article" ?>              
    <?php endif; $i++; ?>
<?php endforeach ?>
</ul>

<ul class="row-2">
<?php $i = 1; foreach($posts as $post): ?>
    <?php if($i % 2 == 0): ?>
        <?php echo "$article" ?>              
    <?php endif; $i++; ?>
<?php endforeach ?>
</ul>

如果我这样做,每隔三个循环进入第三个列表,每隔两个循环进入第二个列表。但问题是:

第 5 条和第 10 条将出现在两个列表中...

所以我必须将整个 foreach 循环分成 3 个部分,一个计数器计数到 3,然后如果它在 3,它再次变为 0,所以我可以将每个 1 放入第一个列表,每 2 个放入第二个列表每3个进入第三个列表 但我完全不知道如何解决这个问题。

我希望你们能帮帮我,我很抱歉我的英语不好..

非常感谢。

我不确定这是否适用于您的订单,但 array_chunk、https://secure.php.net/manual/en/function.array-chunk.php 可能会满足您的要求。

这样您就不必处理共享公倍数的问题。

如果排序有问题,array_chunk 页面上有一条评论,其中包含一些执行 array_chunk_vertical 的代码。这两种方法中的一种应该可以满足您的需求。

类似下面未经测试的代码:

// 每个组都在它自己的部分数组中。 $sections = array_chunk($posts, 2);

所以解决我的小问题很简单^^ :

<?php
function partition( $list, $p ) {
    $listlen = count( $list );
    $partlen = floor( $listlen / $p );
    $partrem = $listlen % $p;
    $partition = array();
    $mark = 0;
    for ($px = 0; $px < $p; $px++) {
        $incr = ($px < $partrem) ? $partlen + 1 : $partlen;
        $partition[$px] = array_slice( $list, $mark, $incr );
        $mark += $incr;
    }
    return $partition;
}

$sec1 = partition($posts, 3);
$sec2 = partition($posts, 3);
$sec3 = partition($posts, 3);
?>

所以我在 Stack Overflow 上找到了这个函数,它将一个数组分成 3 个部分(或者你写的每个其他数字而不是 x: partition($array, x); )。

接下来就简单了:

<?php foreach($sec1[0] as $post): ?>
    ...
<?php endforeach ?>

我只需为每个列表制作 3 个部分,并为每个列表制作一个 foreach。