PHPのarray_map関数の使い方!配列の全要素に一括処理を適用

PHPのarray_map関数は、1つまたは複数の配列のすべての要素に対して、指定したコールバック関数を適用し、その結果から新しい配列を生成するために使用されます。

データの変換、整形、特定の処理の一括適用など、配列の操作において非常に強力で便利な関数です。
foreachループで同じ処理を書くよりも簡潔に記述できることが多く、コードの可読性を向上させます。

この記事では、array_map関数の基本的な使い方、引数、戻り値、複数の配列を扱う方法、そして使用する際の注意点について解説します。

array_map関数の基本的な構文

array_map 関数の基本的な構文は以下の通りです。

array_map(callable $callback, array $array, array ...$arrays): array
  • $callback: 各配列要素に適用するコールバック関数です。関数名(文字列)、匿名関数(クロージャ)、オブジェクトのメソッド、静的メソッドなどを指定できます。
  • $array: 処理対象となる最初の配列です。
  • ...$arrays: オプションで、2番目以降の配列を複数指定できます。

array_map関数の仕組みと戻り値

array_map関数は、以下の手順で動作します。

  1. $array(および追加の $arrays) の各要素を順番に取得します。
  2. 取得した要素を $callback 関数に引数として渡して実行します。
  3. $callback 関数が返した値を新しい配列の要素として格納します。
  4. すべての要素の処理が完了すると、新しい配列を返します。元の配列は変更されません。

戻り値:
処理後の新しい配列が返されます。
元の配列のキーは保持されません(数値インデックスに再割り当てされます)。

array_map関数を使う

array_map関数を実際に使用して、動作を確認します。

例1:各数値を2倍にする

最も基本的な使い方です。配列の各要素に同じ処理を適用します。

<?php
$numbers = [1, 2, 3, 4, 5];

// 匿名関数 (クロージャ) を使用
$doubledNumbers = array_map(function($n) {
    return $n * 2;
}, $numbers);

print_r($doubledNumbers);
// 出力:
// Array
// (
//     [0] => 2
//     [1] => 4
//     [2] => 6
//     [3] => 8
//     [4] => 10
// )

// 関数名を文字列で指定する場合
function multiplyByTwo($n) {
    return $n * 2;
}
$doubledNumbers2 = array_map('multiplyByTwo', $numbers);
print_r($doubledNumbers2);
?>

$numbersに数値の配列を作成しています。
次の処理でarray_map関数で、作成した配列を使用し、配列内の値を2倍にしています。

$nにはそれぞれの配列の値が入ってきて、「$n * 2」で配列の値を2倍にして、returnで返しています。
$doubledNumbersを確認すると、2倍になっていることが確認できます。

次のmultiplyByTwo関数は、先ほどのクロージャを名前をつけた関数にした例です。
名前付きの関数もarray_map関数の第1引数に、関数名を文字列として渡すことができます。
$doubledNumbers2に返ってきた結果は同じになります。

例2:文字列を大文字に変換する

文字列操作にも便利です。
strtoupperのような組み込み関数もコールバックとして使用できます。

<?php
$names = ['alice', 'bob', 'charlie'];
$upperNames = array_map('strtoupper', $names);

print_r($upperNames);
// 出力:
// Array
// (
//     [0] => ALICE
//     [1] => BOB
//     [2] => CHARLIE
// )
?>

$namesには、英字の名前が入っています。
strtoupperは小文字を大文字にしてくれる関数です。

結果、配列内の小文字が大文字になっていることが確認できます。

複数の配列を扱う方法

array_mapは、複数の配列を引数として受け取り、それぞれの配列から対応する要素を$callback関数の引数として渡すことができます。

2つの配列の要素を合計する

array_map関数に2つの配列を指定した例です。

<?php
$array1 = [1, 2, 3];
$array2 = [4, 5, 6];

$sums = array_map(function($a, $b) {
    return $a + $b;
}, $array1, $array2);

print_r($sums);
// 出力:
// Array
// (
//     [0] => 5
//     [1] => 7
//     [2] => 9
// )
?>

$array1$array2を指定しています。
$aには$array1$bには$array2の値が入ってきます。

それを足して、返しているので、2つの値を足した結果が$sumsに格納されます。

3つの配列の要素を結合する

array_map関数に3つの配列を指定した例です。

<?php
$firstNames = ['John', 'Jane', 'Peter'];
$lastNames = ['Doe', 'Smith', 'Jones'];
$ages = [30, 25, 40];

$fullDetails = array_map(function($first, $last, $age) {
    return "$first $last ({$age}歳)";
}, $firstNames, $lastNames, $ages);

print_r($fullDetails);
// 出力:
// Array
// (
//     [0] => John Doe (30歳)
//     [1] => Jane Smith (25歳)
//     [2] => Peter Jones (40歳)
// )
?>

3つの配列を指定して、配列の値を文字列結合して返しています。

配列の長さが異なる場合

複数の配列の長さが異なる場合、array_map は最も長い配列の長さに合わせて処理を行います。
短い配列の対応する要素は、$callback関数にNULLとして渡されます。

<?php
$a = [1, 2, 3];
$b = [4, 5];

$result = array_map(function($x, $y) {
    // NULL値が渡される可能性があるため、null合体演算子 (??) や条件分岐で対応
    return ($x ?? 0) + ($y ?? 0);
}, $a, $b);

print_r($result);
// 出力:
// Array
// (
//     [0] => 5
//     [1] => 7
//     [2] => 3 // $y が NULL として渡されるため、3 + 0 = 3
// )
?>

array_map関数を使う際の注意点

  • キーは保持されない: array_map は新しい配列を生成し、元の配列の数値インデックス(0, 1, 2…)を再割り当てします。連想配列のキーは保持されません。キーを保持したい場合は、foreach ループや array_walk() の使用を検討してください。
  • NULL値の扱い: 複数の配列を渡し、配列の長さが異なる場合、短い配列の対応する要素にはNULLが渡されます。$callback 関数内でNULL値を適切に処理するように注意が必要です。
  • null コールバック: コールバックにnullを渡すと、array_mapは各要素の配列を生成します。これは、複数の配列を1つの配列に結合したい場合に便利です。
<?php
$a = [1, 2, 3];
$b = ['a', 'b', 'c'];
$result = array_map(null, $a, $b);
print_r($result);
// 出力:
// Array
// (
//     [0] => Array ( [0] => 1 [1] => a )
//     [1] => Array ( [0] => 2 [1] => b )
//     [2] => Array ( [0] => 3 [1] => c )
// )
?>
  • エラーハンドリング: コールバック関数内でエラーが発生した場合、それは通常のPHPのエラーとして扱われます。

array_mapとforeach / array_walkとの違い

機能 array_map foreach ループ array_walk()
用途 新しい配列を生成する (変換、整形) 配列の各要素に処理を行う (結果を新しい配列に格納することも可能) 元の配列を変更する (要素ごとに処理)
戻り値 新しい配列 なし (直接操作または別の配列に代入) true または false (処理が成功したか)
キーの保持 しない (常に数値インデックス) する する
多次元配列 サポートしない (ネストした配列は個別に処理が必要) サポートする サポートする (第3引数で再帰的に処理可能)
柔軟性 簡潔だが、特定の目的に特化している 非常に柔軟 キーや値、ユーザーデータをコールバックに渡せる

使い分けの目安:

  • array_map: 配列の各要素を変換・加工して、新しい配列が欲しい場合に最適です。
  • foreach ループ: 最も汎用性が高く、配列の要素を直接操作したい場合や、キーを保持したい場合、複雑なロジックが必要な場合に適しています。
  • array_walk(): 配列の要素を直接操作したいが、foreach よりも関数型プログラミング的なアプローチを取りたい場合に適しています。キーも保持されます。

まとめ

PHPのarray_map関数は、配列のすべての要素に対して一括で変換や加工を行うための強力なツールです。
簡潔なコードで新しい配列を生成できるため、データ処理の効率と可読性を向上させます。

単一の配列だけでなく、複数の配列を同時に処理する機能も持ち合わせています。
ただし、キーが保持されない点や、複数の配列を扱う際のNULL値の扱いに注意し、foreacharray_walk()との使い分けを理解して、状況に応じて最適な関数を選択しましょう。

PHP

コメント