この記事では、PHPで配列の全要素を効率的に処理するためのarray_walk()とarray_map()の使い方を解説します。

PHPで配列の全要素を一括で処理する方法を知りたいんですが、どうすればいいですか?



PHPにはarray_walk()とarray_map()という便利な関数があります。array_walk()は配列の各要素に対して関数を実行し、array_map()は各要素を変換した新しい配列を返します。
array_walk()の使い方: 各要素への反復処理
array_walk()は、配列の各要素に対して指定した関数を実行するための関数です。以下の例で、その使用方法を見てみましょう。
$fruits = ['apple', 'banana', 'orange'];
function printItem($item) {
echo '**アイテム**: ' . $item . PHP_EOL;
}
array_walk($fruits, 'printItem');
このプログラムは、配列$fruitsの各要素を反復し、printItem関数を通じて出力します。
array_walk()の使い方: 各要素への反復処理
**array_walk()**は、配列の各要素に対して指定した関数を一つずつ適用するためのPHPの関数です。この関数は、配列の要素に対して特定の処理を行いたい場合に非常に便利です。
基本構文
array_walk(配列, 関数名, [オプションの引数]);
- 配列: 処理を行いたい配列を指定します。
- 関数名: 各要素に適用したい関数を指定します。
- オプションの引数: 必要に応じて関数に追加で渡すことができる引数です。
サンプルプログラム
次に、array_walk()を使って、配列の各要素に処理を行う例を見てみましょう。
$fruits = ['apple', 'banana', 'orange'];
function printItem($item, $key) {
echo 'キー: ' . $key . ' - **アイテム**: ' . $item . PHP_EOL;
}
array_walk($fruits, 'printItem');
このプログラムでは、$fruitsという配列の各要素にprintItem関数が適用されます。printItem関数は、配列の各要素とそのキーを受け取り、それらを出力します。
オプション引数の使用
array_walk()では、追加の引数を渡すことも可能です。以下の例では、オプション引数を使って、各要素に接頭辞を追加しています。
$fruits = ['apple', 'banana', 'orange'];
function addPrefix($item, $key, $prefix) {
echo 'キー: ' . $key . ' - アイテム: ' . $prefix . $item . PHP_EOL;
}
$prefix = 'フルーツ: ';
array_walk($fruits, 'addPrefix', $prefix);
この例では、$prefixがaddPrefix関数に追加の引数として渡され、各要素に「フルーツ: 」という接頭辞が追加されて出力されます。
array_map()の使い方: 配列の各要素を変換する方法
array_map()は、配列の各要素に対して指定した関数を適用し、その結果を新しい配列として返すPHPの関数です。この関数は、元の配列を変更せずに、変換された新しい配列を生成する際に非常に役立ちます。
基本構文
array_map(関数名, 配列1, 配列2, …);
- 関数名: 各要素に適用したい関数を指定します。
- 配列1, 配列2, …: 処理対象の1つ以上の配列を指定します。複数の配列を指定すると、それぞれの配列の対応する要素が関数に渡されます。
サンプルプログラム
次に、array_map()を使って、配列の各要素を変換する例を見てみましょう。
$numbers = [1, 2, 3, 4];
function square($number) {
return '**平方**: ' . ($number * $number);
}
$squaredNumbers = **array_map('square', $numbers);**
print_r($squaredNumbers);
このプログラムでは、$numbersという配列の各要素がsquare関数に渡され、各数値が平方されます。その結果、新しい配列$squaredNumbersには、各要素の平方が格納されます。
複数の配列に対する操作
array_map()では、複数の配列を同時に処理することも可能です。以下の例では、2つの配列を使って、それぞれの要素を加算します。
$numbers1 = [1, 2, 3];
$numbers2 = [4, 5, 6];
function add($a, $b) {
return '**合計**: ' . ($a + $b);
}
$sumNumbers = **array_map('add', $numbers1, $numbers2);**
print_r($sumNumbers);
この例では、$numbers1と$numbers2の各要素がadd関数に渡され、各ペアの要素が加算されて新しい配列$sumNumbersが生成されます。
array_walk()とarray_map()の違い: 表で比較
**array_walk()とarray_map()**はどちらもPHPで配列を処理するための便利な関数ですが、それぞれの目的と挙動には明確な違いがあります。以下の表で、これらの関数の違いを比較してみましょう。
| 特徴/機能 | array_walk() | array_map() |
|---|---|---|
| 目的 | 配列の各要素に対して関数を適用し、元の配列を直接操作 | 配列の各要素に対して関数を適用し、新しい配列を返す |
| 返り値 | なし(元の配列が直接変更される) | 新しい配列(元の配列は変更されない) |
| 適用範囲 | 1つの配列 | 複数の配列にも対応 |
| 処理結果の保存 | 元の配列に結果が反映される | 処理結果を新しい配列として返す |
| ネストした配列への対応 | **array_walk_recursive()**を使用する必要がある | **array_map()**はネストした配列には対応しない |
| コールバック関数の引数 | 配列のキーと値が渡される | 複数の配列の対応する要素がそれぞれ渡される |
| 実行時の副作用 | 副作用あり(元の配列が変更される) | 副作用なし(新しい配列が生成されるため) |
具体的な違い
- array_walk()は、元の配列に直接作用するため、配列の要素を上書きしたり、操作したりする場合に適しています。例えば、配列の各要素を出力する場合や、要素を加工する場合に便利です。
- array_map()は、元の配列を変更せずに、新しい配列を作成するために使用します。例えば、元の配列を基に新しい値を生成する場合や、複数の配列の要素を組み合わせる場合に便利です。
まとめ
- array_walk()は、配列の各要素に対して関数を適用し、元の配列を直接変更する関数です。
- array_map()は、配列の各要素に関数を適用し、その結果を新しい配列として返します。元の配列は変更されません。
- array_walk()は、配列に対して直接処理を行いたい場合に有効で、特に副作用が許容されるケースで便利です。
- array_map()は、元の配列を変更せずに、変換された新しい配列が必要な場合に適しています。
- array_walk()は1つの配列に対して処理を行いますが、array_map()は複数の配列に対して同時に処理を行うことができます。



今回、array_walk()とarray_map()について詳しく説明しました。これらの関数を適切に使い分けることで、PHPでの配列操作がさらに効率的になります。ぜひ実際のコードで活用してみてください。
また、array_walk_recursive()という関数もあり、これはネストされた配列にも対応しています。多次元配列を扱う際には、この関数を検討してみると良いでしょう。

