【PHP8.x】array_map関数の使い方

作成日: 更新日:

array_map関数は、一つまたは複数の配列の要素に対して、指定されたコールバック関数を適用し、その結果からなる新しい配列を生成する関数です。この関数は、元の配列の値を変更せずに、変換された新しい配列を作成する際に役立ちます。

具体的には、第一引数に関数(コールバック関数)を指定し、第二引数以降に処理対象となる配列を一つまたは複数指定します。コールバック関数は、指定された配列の要素を受け取り、何らかの処理を行った結果を返します。array_map関数は、各配列の対応する要素を順にコールバック関数に渡し、その戻り値を新しい配列の要素として格納します。

複数の配列が指定された場合、コールバック関数はそれぞれの配列から対応する要素を引数として受け取ります。もし配列の要素数が異なる場合、最も短い配列の要素数に合わせて処理が実行され、不足している配列の要素についてはコールバック関数にNULLが渡されます。

array_map関数は、配列の要素を一つずつ変換したり、複数の配列の要素を組み合わせて新しい値を生成したりする場合に特に有効です。例えば、数値配列の各要素を二乗したり、二つの配列の対応する要素同士を足し合わせたりといった処理を簡単に行うことができます。コールバック関数にNULLを指定すると、複数の配列から対応する要素を組み合わせた多次元配列を作成できます。この関数は、データ処理や変換において、柔軟性と効率性を提供する重要なツールとなります。

基本的な使い方

構文(syntax)

array_map(callable $callback, array $array1, array ...$arrays): array

引数(parameters)

?callable $callback, array $array, array ...$arrays

  • ?callable $callback: 各要素に適用するコールバック関数。関数名、クロージャ、またはオブジェクトのメソッドを指定できます。
  • array $array: 処理対象の配列。
  • array ...$arrays: 処理対象の追加の配列。指定された場合、コールバック関数には各配列から対応する要素が渡されます。

戻り値(return)

array

array_map 関数は、配列の各要素に指定したコールバック関数を適用し、その結果を格納した新しい配列を返します。

サンプルコード

PHP: array_mapとforeachの速度比較

<?php

declare(strict_types=1);

/**
 * array_map と foreach の処理速度を比較します。
 *
 * 大規模な配列の各要素を2倍にする処理を行い、それぞれの実行時間を計測して表示します。
 * 一般的に、単純な操作では foreach の方が内部的な関数呼び出しのオーバーヘッドが少ないため、
 * わずかに高速になる傾向があります。
 *
 * @param int $elementCount 比較に使用する配列の要素数
 */
function comparePerformance(int $elementCount = 1_000_000): void
{
    // 計測用の巨大な配列を生成
    $sourceArray = range(1, $elementCount);

    // --- array_map のパフォーマンスを計測 ---
    $startTimeMap = microtime(true);

    // array_map を使って各要素を2倍にする
    // PHP 7.4 から導入されたアロー関数をコールバックに使用
    $resultMap = array_map(fn($number) => $number * 2, $sourceArray);

    $endTimeMap = microtime(true);
    $durationMap = $endTimeMap - $startTimeMap;

    // --- foreach のパフォーマンスを計測 ---
    $startTimeForeach = microtime(true);

    // foreach を使って各要素を2倍にする
    $resultForeach = [];
    foreach ($sourceArray as $number) {
        $resultForeach[] = $number * 2;
    }

    $endTimeForeach = microtime(true);
    $durationForeach = $endTimeForeach - $startTimeForeach;

    // --- 結果の表示 ---
    $elementCountFormatted = number_format($elementCount);
    echo "{$elementCountFormatted}個の要素を持つ配列の処理時間:" . PHP_EOL;
    printf("array_map: %.6f 秒" . PHP_EOL, $durationMap);
    printf("foreach    : %.6f 秒" . PHP_EOL, $durationForeach);

    // メモリを解放 (大規模配列を扱うため)
    unset($sourceArray, $resultMap, $resultForeach);
}

// 関数を実行してパフォーマンスを比較
comparePerformance();

PHPのarray_map関数は、配列の各要素に対して指定したコールバック関数を適用し、その結果を要素とする新しい配列を生成して返します。コールバック関数とは、他の関数に引数として渡される関数のことです。

このサンプルコードは、array_map関数とforeachループの処理速度を比較するものです。100万個の要素を持つ巨大な配列を用意し、各要素を2倍にするという同じ処理を両方の方法で実行して、それぞれの実行時間を計測しています。

array_map関数では、第一引数に各要素への処理内容を定義したコールバック関数(この例では数値を2倍にするアロー関数)、第二引数に処理対象の配列を渡しています。これにより、元の配列の全ての要素が2倍にされた新しい配列が戻り値として得られます。

一般的に、サンプルコードのような単純な処理の場合、foreachループの方が各要素の処理ごとに関数を呼び出す内部的なオーバーヘッドが少ないため、array_mapよりもわずかに高速になる傾向があります。

このコードはarray_mapforeachの速度を比較していますが、結果はPHPのバージョンや処理内容で変わるため、常にforeachが高速とは限りません。この速度差は参考程度に捉えましょう。array_mapは、配列の全要素へ同じ処理を適用する際にコードを簡潔に記述できる利点があります。サンプルで使われているアロー関数fn(...)はPHP 7.4以降の構文であり、古いバージョンでは動作しない点に注意が必要です。多くの場合、わずかな性能差よりもコードの読みやすさが重要になるため、処理の目的に応じて両者を使い分けることが大切です。

PHP array_map で連想配列をマッピングする

<?php

/**
 * array_map を使って連想配列を処理するサンプルコード
 * 
 * この例では、商品ごとの価格と在庫を持つ2つの連想配列を使い、
 * それらをマッピングして商品詳細情報を持つ新しい連想配列を生成します。
 */
function createProductDetails(): void
{
    // 商品ごとの価格情報を持つ連想配列
    $prices = [
        'apple'  => 150,
        'orange' => 120,
        'grape'  => 300,
    ];

    // 商品ごとの在庫情報を持つ連想配列
    $stocks = [
        'apple'  => 30,
        'orange' => 50,
        'grape'  => 15,
    ];

    // array_mapを使用して、2つの連想配列から新しい連想配列を生成します。
    // コールバック関数の引数 $price には $prices の値が、
    // $stock には $stocks の値が、同じキー('apple', 'orange'など)ごとに渡されます。
    // 元の配列のキーは、結果の配列でも維持されます。
    $productDetails = array_map(
        fn(int $price, int $stock): array => ['price' => $price, 'stock' => $stock],
        $prices,
        $stocks
    );

    // 生成された新しい連想配列を出力します
    print_r($productDetails);
}

createProductDetails();

/*
--- 実行結果 ---
Array
(
    [apple] => Array
        (
            [price] => 150
            [stock] => 30
        )

    [orange] => Array
        (
            [price] => 120
            [stock] => 50
        )

    [grape] => Array
        (
            [price] => 300
            [stock] => 15
        )

)
*/

PHPの array_map 関数は、配列の各要素に対して指定した処理を行い、その結果から新しい配列を作成して返す関数です。

第一引数には、各要素に適用する処理内容を定義したコールバック関数を指定します。第二引数以降には、処理対象となる配列を一つ以上指定します。

このサンプルコードでは、商品の価格情報を持つ $prices 配列と、在庫情報を持つ $stocks 配列という2つの連想配列を array_map に渡しています。array_map は、これら2つの配列から同じキー('apple'、'orange'など)を持つ値をペアで取り出し、コールバック関数の引数 $price$stock にそれぞれ渡します。

コールバック関数は、受け取った価格と在庫の値を使って ['price' => ..., 'stock' => ...] という形式の新しい連想配列を生成して返します。array_map は、すべてのキーに対してこの処理を繰り返し、その結果をまとめて一つの新しい配列を生成します。このとき、元の連想配列のキーは、結果の配列にもそのまま維持されるのが特徴です。最終的に、商品名をキーとし、価格と在庫を値に持つ多次元連想配列が生成されます。

array_mapは、複数の連想配列を渡すと、同じキーを持つ値をペアにして処理できる便利な関数です。元の配列のキーは、処理後の配列にもそのまま引き継がれます。注意点として、渡した配列間でキーが一致しない場合、片方の配列にしか存在しないキーに対応する値は null として扱われます。サンプルコードのようにコールバック関数の引数に型を指定していると、null が渡された際にエラーが発生する原因となります。そのため、入力となる配列のキーが常に揃っていることを確認するか、コールバック関数内で null の場合の処理を考慮する必要があります。

【PHP8.x】array_map関数の使い方 | いっしー@Webエンジニア