複数の配列を同時にループする場合、共通の問題は、ループ構造が不適切なため、結果が不正確になる可能性があることです。次の例を考えてみましょう。
$data1 = ['a: 1', 'a: 2', 'a: 3', 'a: 4', 'a: 5']; $data2 = ['b: 1', 'b: 2', 'b: 3', 'b: 4', 'b: 5']; foreach ($data1 as $item1) { foreach ($data2 as $item2) { echo $item1 . '<br/>'; echo $item2 . '<br/>'; echo '<br/><br/>'; } }
上記のコードはネストされた foreach ループを使用しており、次の出力が生成されます。
a: 1 b: 1 a: 1 b: 2 a: 1 b: 3 a: 1 b: 4 a: 1 b: 5
ただし、予期される出力は次のとおりです。
a: 1 b: 1 a: 2 b: 2 a: 3 b: 3 a: 4 b: 4 a: 5 b: 5
問題は、入れ子になったループ構造により、$data1 の各要素が $data2 のすべての要素とともにループされることです。目的の出力を実現するには、両方の配列を同時にループする必要があります。
複数の配列を同時にループするには、さまざまな方法を使用できます。
array_map() メソッド (PHP) >=5.3):
このメソッドを使用すると、複数の配列とその要素を処理するコールバック関数を渡すことができます。
array_map(function($v1, $v2){ echo $v1 . '<br>'; echo $v2 . '<br>'; }, $data1, $data2);
MultipleIterator メソッド (PHP >=5.3):
このメソッドは、複数の配列を同時に反復処理するために使用できる複数の反復子オブジェクトを作成します。
$it = new MultipleIterator(); $it->attachIterator(new ArrayIterator($data1)); $it->attachIterator(new ArrayIterator($data2)); foreach ($it as $a) { echo $a[0] . '<br>'; echo $a[1] . '<br>'; }
for カウンター付きループ (PHP) >=4.3):
このメソッドは、カウンター変数を含む for ループを使用して、両方の配列を反復処理します。
$keysOne = array_keys($data1); $keysTwo = array_keys($data2); $min = min(count($data1), count($data2)); for ($i = 0; $i < $min; $i++) { echo $data1[$keysOne[$i]] . '<br>'; echo $data2[$keysTwo[$i]] . '<br>'; }
array_combine () メソッド (PHP >=5.0):
このメソッドは、配列に一意の値がある場合に使用できます。配列を 1 つの配列に結合します。$data1 の要素がキー、$data2 の要素が値です。
foreach (array_combine($data1, $data2) as $d1 => $d2) { echo $d1 . '<br>'; echo $d2 . '<br>'; }
call_user_func_array() メソッド ( PHP >=5.6):
このメソッドを使用すると、複数のメソッドを渡すことができます配列をコールバック関数に渡します。
$func = function (...$numbers) { foreach ($numbers as $v) echo $v . '<br>'; echo '<br>'; }; call_user_func_array("array_map", [$func, $data1, $data2]);
以上がPHP で複数の配列を同時に効率的にループするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。