给定 N 项目数组:
$arr = array('a', 'b', 'c', 'd', 'e', 'f');
在 M 项目组中循环的最优雅方式是什么(假设 N 可以被 M 整除)?
我试过
foreach (array_chunk($arr, 2) as list($first, $second)) {
// do stuff with $first and $second
}
但这会导致语法错误。
换句话说,我想模仿Tcl中的内容:
set arr [a b c d e f]
foreach {first second} $arr {
// do stuff with $first and $second
}
现在我采取了明显的措施:
foreach (array_chunk($arr, 2) as $group) {
$first = $group[0];
$second = $group[1];
// do stuff with $first and $second
}
但我希望有人有更优雅的方法......
答案 0 :(得分:2)
您可以像这样使用
$arr = array('a', 'b', 'c', 'd', 'e', 'f');
$chunks = array_chunk($arr, 2);
while (list($first, $second) = each($chunks))
{
...
}
如果将array_chunk()
放入each()
,它将产生无限循环:(
答案 1 :(得分:2)
我将你的最后一个变种改为
foreach (array_chunk($arr, 2) as $group) {
list( $first, $second) = $group;
// do stuff with $first and $second
}
我想到的任何其他解决方案都会更复杂,比如
for ( $i = 0; $i < ceil(count($arr)/2) ; $i++) {
$first = $arr[$i*2];
$second = $arr[$i*2+1];
}
答案 2 :(得分:2)
没有,没有像你想要的那样的语法糖。然而,他们有很多方法可以实现这一目标。
for($i=0; $first=$arr[$i], $second=$arr[$i+1], $i<$len; $i+=2){
}
foreach (array_chunk($arr, 2) as $chunk) {
list($first, $second) = $chunk;
}
请参阅foreach
表单。它与你的语法没什么不同。
$i=0;
while(list($first, $second) = array_slice($arr, ($i+=2)-2, 2)) {
}
答案 3 :(得分:1)
您可以使用array_splice
while ( list($first, $second) = array_splice($arr, 0, 2) ) {
echo $first.', '.$second.PHP_EOL;
}
notice
变空时会抛出$arr
while ( !empty($arr) && list($first, $second) = array_splice($arr, 0, 2) ) {
echo $first.', '.$second.PHP_EOL;
}
但如果数组的大小为notice
,则仍会抛出odd
。
答案 4 :(得分:0)
可能是利用SPL的multipleIterator的一个案例:
$arr = array('a', 'b', 'c', 'd', 'e', 'f');
$chunks = array_chunk($arr, 2);
$iterator = new MultipleIterator;
foreach($chunks as $chunk) {
$iterator->attachIterator(new ArrayIterator($chunk));
}
foreach ($iterator as $values) {
var_dump($values[0], $values[1], $values[2]);
}