1

给定一个包含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
}

但我希望有人有更优雅的方法......

4

5 回答 5

2

,没有像你想要的那样的语法糖。然而,他们有很多方法可以实现这一目标。

循环

for($i=0; $first=$arr[$i], $second=$arr[$i+1], $i<$len; $i+=2){
}

Foreach 循环

foreach (array_chunk($arr, 2) as $chunk) {
    list($first, $second) = $chunk;
}

foreach表格。它与您的语法没有太大不同。

While 循环

$i=0;
while(list($first, $second) = array_slice($arr, ($i+=2)-2, 2)) {
}
于 2012-10-28T11:06:55.900 回答
2

你可以像这样使用它

$arr = array('a', 'b', 'c', 'd', 'e', 'f');

$chunks = array_chunk($arr, 2);
while (list($first, $second) = each($chunks))
{
    ...
}

如果你放入array_chunk()each()会产生一个无限循环:(

于 2012-10-28T11:03:56.167 回答
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];
}
于 2012-10-28T11:06:55.480 回答
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如果数组的大小是 ,这仍然会抛出 a odd

于 2012-10-28T11:24:36.070 回答
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]);
}
于 2012-10-28T11:56:07.313 回答