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。
我的网站有点问题。我有一个博客,每篇文章都在一个列表中。现在我想把这个列表分成 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。