PHP:如何将foreach-loop拆分为3个部分?

时间:2016-12-27 15:10:08

标签: php list foreach counter blogs

我的网站上有一点问题。我有一个博客,每篇文章都在一个列表中。现在我想将这一个列表拆分为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进入第三个清单 但我完全不知道如何解决这个问题。

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

非常感谢。

2 个答案:

答案 0 :(得分:3)

我不确定这会对你的订购有效,但是array_chunk https://secure.php.net/manual/en/function.array-chunk.php可以做你想要的。

这样您就不必处理共享的共同倍数。

如果排序是个问题,那么在array_chunk页面上有一个注释,它有一些代码可以执行array_chunk_vertical。这两种方法中的一种应该能满足您的需求。

下面这个未经测试的代码:

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

                                   

答案 1 :(得分:0)

所以对我的小问题的解决很容易^^:

<?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。