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

このように使えます

$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 に答える
2

いいえ、あなたが望むような構文糖衣はありません。ただし、これを実現する方法はたくさんあります。

Forループ

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 に答える
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のmultiplierIteratorを利用する場合:

$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 に答える