我有一个foreach
循环,如下所示的代码:
foreach($coupons as $k=>$c ){
//...
}
现在,我想在每个循环中获取两个值。
例如:
第一圈:0,1
第二圈:2,3
第三圈:4,5
我该怎么办?
将数组拆分为大小为 2
的块:
$chunks = array_chunk($coupons, 2);
foreach ($chunks as $chunk) {
if (2 == sizeof($chunk)) {
echo $chunk[0] . ',' . $chunk[1];
} else {
// if last chunk contains one element
echo $chunk[0];
}
}
如果要保留键 - 使用第三个参数作为true
:
$chunks = array_chunk($coupons, 2, true);
print_r($chunks);
为什么
你不使用这样的for循环:
$length = count($collection);
for($i = 0; $i < $length ; i+=2)
{
// Do something
}
首先,我假设你没有使用 PHP 7。
但是,可以这样做,这是高度,非常不鼓励的,并且可能会导致循环中的意外行为。按照@Rizier123的建议编写一个标准的for循环会更好。
假设你真的想这样做,方法如下:
在任何循环中,PHP 都会保留一个指向可迭代对象的内部指针。您可以更改此指针。
foreach($coupons as $k=>$c ){
// $k represents the current element
next($coupons); // move the internal array pointer by 1 space
$nextK = current($coupons);
prev($coupons);
}
有关更多详细信息,请查看内部数组指针的文档。
同样,根据foreach的文档(强调我的):
注意:在 PHP 5 中,当 foreach 第一次开始执行时,内部数组指针会自动重置为 数组。这意味着您不需要在 foreach 循环。As foreach 依赖于 PHP 中的内部数组指针 5、在循环内更改它可能会导致意外行为。在 PHP 中 7、foreach 不使用内部数组指针。
假设你的数组如下所示$a
:
$a = [
"a"=>1,
"b"=>2,
"c"=>3,
"d"=>4,
"e"=>5,
"f"=>6,
"g"=>7,
"h"=>8,
"i"=>9
];
$b = array_chunk($a,2,true);
foreach ($b as $key=>$value) {
echo implode(',',$value) . '<br>';
}
首先,我们将数组拆分为块(保留键的参数true
),然后执行foreach
循环。由于使用了 implode()
,您不需要条件语句。
好吧,
这将是1种方法:
$keys=array_keys($coupons);
for($i=0;$i<count($keys);++$i){
$current=$coupons[$keys[$i]];
$next=(isset($keys[$i+1])?$coupons[$keys[$i+1]]:NULL);
}
现在,当前值在 $current 中,下一个值在 $next 中,当前键在 $keys[$i] 中,下一个键在 $keys[$i+1] 中,依此类推。