【PHP8.x】array_map()関数の使い方
array_map関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
array_map関数は、一つまたは複数の配列の要素に対して、指定されたコールバック関数を適用し、その結果からなる新しい配列を生成する関数です。この関数は、元の配列の値を変更せずに、変換された新しい配列を作成する際に役立ちます。
具体的には、第一引数に関数(コールバック関数)を指定し、第二引数以降に処理対象となる配列を一つまたは複数指定します。コールバック関数は、指定された配列の要素を受け取り、何らかの処理を行った結果を返します。array_map関数は、各配列の対応する要素を順にコールバック関数に渡し、その戻り値を新しい配列の要素として格納します。
複数の配列が指定された場合、コールバック関数はそれぞれの配列から対応する要素を引数として受け取ります。もし配列の要素数が異なる場合、最も短い配列の要素数に合わせて処理が実行され、不足している配列の要素についてはコールバック関数にNULLが渡されます。
array_map関数は、配列の要素を一つずつ変換したり、複数の配列の要素を組み合わせて新しい値を生成したりする場合に特に有効です。例えば、数値配列の各要素を二乗したり、二つの配列の対応する要素同士を足し合わせたりといった処理を簡単に行うことができます。コールバック関数にNULLを指定すると、複数の配列から対応する要素を組み合わせた多次元配列を作成できます。この関数は、データ処理や変換において、柔軟性と効率性を提供する重要なツールとなります。
構文(syntax)
1array_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の速度比較
1<?php 2 3declare(strict_types=1); 4 5/** 6 * array_map と foreach の処理速度を比較します。 7 * 8 * 大規模な配列の各要素を2倍にする処理を行い、それぞれの実行時間を計測して表示します。 9 * 一般的に、単純な操作では foreach の方が内部的な関数呼び出しのオーバーヘッドが少ないため、 10 * わずかに高速になる傾向があります。 11 * 12 * @param int $elementCount 比較に使用する配列の要素数 13 */ 14function comparePerformance(int $elementCount = 1_000_000): void 15{ 16 // 計測用の巨大な配列を生成 17 $sourceArray = range(1, $elementCount); 18 19 // --- array_map のパフォーマンスを計測 --- 20 $startTimeMap = microtime(true); 21 22 // array_map を使って各要素を2倍にする 23 // PHP 7.4 から導入されたアロー関数をコールバックに使用 24 $resultMap = array_map(fn($number) => $number * 2, $sourceArray); 25 26 $endTimeMap = microtime(true); 27 $durationMap = $endTimeMap - $startTimeMap; 28 29 // --- foreach のパフォーマンスを計測 --- 30 $startTimeForeach = microtime(true); 31 32 // foreach を使って各要素を2倍にする 33 $resultForeach = []; 34 foreach ($sourceArray as $number) { 35 $resultForeach[] = $number * 2; 36 } 37 38 $endTimeForeach = microtime(true); 39 $durationForeach = $endTimeForeach - $startTimeForeach; 40 41 // --- 結果の表示 --- 42 $elementCountFormatted = number_format($elementCount); 43 echo "{$elementCountFormatted}個の要素を持つ配列の処理時間:" . PHP_EOL; 44 printf("array_map: %.6f 秒" . PHP_EOL, $durationMap); 45 printf("foreach : %.6f 秒" . PHP_EOL, $durationForeach); 46 47 // メモリを解放 (大規模配列を扱うため) 48 unset($sourceArray, $resultMap, $resultForeach); 49} 50 51// 関数を実行してパフォーマンスを比較 52comparePerformance(); 53
PHPのarray_map関数は、配列の各要素に対して指定したコールバック関数を適用し、その結果を要素とする新しい配列を生成して返します。コールバック関数とは、他の関数に引数として渡される関数のことです。
このサンプルコードは、array_map関数とforeachループの処理速度を比較するものです。100万個の要素を持つ巨大な配列を用意し、各要素を2倍にするという同じ処理を両方の方法で実行して、それぞれの実行時間を計測しています。
array_map関数では、第一引数に各要素への処理内容を定義したコールバック関数(この例では数値を2倍にするアロー関数)、第二引数に処理対象の配列を渡しています。これにより、元の配列の全ての要素が2倍にされた新しい配列が戻り値として得られます。
一般的に、サンプルコードのような単純な処理の場合、foreachループの方が各要素の処理ごとに関数を呼び出す内部的なオーバーヘッドが少ないため、array_mapよりもわずかに高速になる傾向があります。
このコードはarray_mapとforeachの速度を比較していますが、結果はPHPのバージョンや処理内容で変わるため、常にforeachが高速とは限りません。この速度差は参考程度に捉えましょう。array_mapは、配列の全要素へ同じ処理を適用する際にコードを簡潔に記述できる利点があります。サンプルで使われているアロー関数fn(...)はPHP 7.4以降の構文であり、古いバージョンでは動作しない点に注意が必要です。多くの場合、わずかな性能差よりもコードの読みやすさが重要になるため、処理の目的に応じて両者を使い分けることが大切です。
PHP array_mapで配列の空白をtrimする
1<?php 2 3/** 4 * array_map と trim を使用して、配列の各文字列要素から先頭と末尾の空白を除去する例。 5 */ 6 7// サンプルデータ: 先頭や末尾に空白文字を含む文字列の配列 8$dataWithWhitespace = [ 9 ' Apple ', 10 ' Banana ', 11 'Cherry ', 12 ' Date ' 13]; 14 15echo "--- 元の配列 ---\n"; 16print_r($dataWithWhitespace); 17 18// array_map 関数を使用して、配列の各要素に 'trim' 関数を適用 19// array_map は第一引数に指定されたコールバック関数を、第二引数以降の配列の各要素に適用し、 20// 新しい配列として返します。 21// 'trim' 関数は文字列の先頭および末尾から空白文字を取り除きます。 22$trimmedData = array_map('trim', $dataWithWhitespace); 23 24echo "\n--- trim 適用後の配列 ---\n"; 25print_r($trimmedData); 26 27?>
このPHPのサンプルコードは、array_map関数とtrim関数を組み合わせて、配列内の各文字列要素の先頭と末尾から不要な空白文字を除去する方法を示しています。
array_map関数は、配列のすべての要素に対して特定の関数を適用し、その結果を新しい配列として返す関数です。
第一引数には適用したい関数(コールバック関数)を指定し、第二引数以降には処理対象となる配列を指定します。この例では、文字列の空白除去を行うtrim関数を第一引数に、処理したい文字列の配列$dataWithWhitespaceを第二引数に渡しています。戻り値として、処理が施された新しい配列が返されます。
trim関数は、文字列の先頭および末尾から、スペース、タブ、改行などの空白文字を取り除くための関数です。
したがって、このコードでは、まず$dataWithWhitespaceという配列に、先頭や末尾に空白を含む文字列を定義しています。次に、array_map('trim', $dataWithWhitespace)を実行することで、この配列の各要素(' Apple 'や' Banana 'など)に対してtrim関数が適用されます。その結果、先頭と末尾の空白が取り除かれた'Apple'や'Banana'といった文字列が格納された新しい配列$trimmedDataが生成され、出力されます。これは、データ整形などの実務で非常によく利用されるテクニックです。
array_map関数は元の配列を直接変更せず、処理結果を新しい配列として返します。このため、元のデータが必要な場合はコピーが自動的に生成されることを理解しておくと良いでしょう。第一引数に指定しているtrim関数は、文字列の先頭と末尾の空白文字を除去しますが、配列の要素が文字列であることを前提としています。もし配列に文字列以外の型(数値など)が含まれている場合、trimの適用によって予期せぬ結果やエラーが発生する可能性があるため、配列のデータ型に注意が必要です。trimはデフォルトで半角スペース、タブ、改行などの空白文字を除去します。もしこれら以外の特定の文字を除去したい場合は、trim関数の第二引数にその文字を指定してください。また、array_mapの第一引数には関数名を文字列で渡すだけでなく、無名関数(クロージャ)を渡すことで、より複雑な処理を柔軟に記述することも可能です。
PHP array_mapと無名関数で配列を変換する
1<?php 2 3/** 4 * array_map 関数と無名関数を使用して、配列の各要素を2倍にする例を示します。 5 * システムエンジニアを目指す初心者の方にも理解しやすいように、基本的な使用法を示します。 6 */ 7function demonstrateArrayMapWithAnonymousFunction(): void 8{ 9 // 処理の対象となる元の数値配列を定義します。 10 $originalNumbers = [1, 2, 3, 4, 5]; 11 12 echo "元の配列: " . implode(', ', $originalNumbers) . "\n"; 13 14 // array_map 関数は、配列のすべての要素にコールバック関数(ここでは無名関数)を適用し、 15 // その結果を新しい配列として返します。 16 // 元の配列は変更されません。 17 // 18 // 無名関数 (function (int $number): int { ... }) は、 19 // array_map によって配列の各要素 ($number) が渡されるたびに実行されます。 20 // ここでは、受け取った数値を2倍にして返しています。 21 $doubledNumbers = array_map(function (int $number): int { 22 return $number * 2; 23 }, $originalNumbers); 24 25 echo "2倍にした配列: " . implode(', ', $doubledNumbers) . "\n"; 26} 27 28// 定義した関数を実行し、結果を出力します。 29demonstrateArrayMapWithAnonymousFunction(); 30 31?>
PHPのarray_map関数は、指定された配列のすべての要素にコールバック関数を適用し、その結果を新しい配列として返す機能を提供します。この関数は、元の配列の内容を変更することなく、変換された新しい配列を生成したい場合に非常に便利です。
第一引数には、配列の各要素に適用したい処理を記述したコールバック関数を指定します。このサンプルコードでは、無名関数(名前のない関数)を使用しており、配列の各要素が一つずつこの無名関数に渡されます。無名関数は渡された数値を2倍にして返しています。第二引数には、処理の対象となる元の配列を指定します。
array_map関数は、コールバック関数が返した値を集めて新しい配列として返します。これにより、元の$originalNumbers配列は[1, 2, 3, 4, 5]のまま保持され、各要素を2倍にした結果である[2, 4, 6, 8, 10]という新しい配列が$doubledNumbersに格納されます。システムエンジニアを目指す上で、配列の要素を一括で変換する際に頻繁に利用される基本的な関数の一つです。
array_map関数は、元の配列を変更せず、処理結果を新しい配列として返す点にご注意ください。これは初心者が混同しやすいポイントです。サンプルコードのように無名関数の引数や戻り値に型宣言(例: int $number, : int)を用いると、意図しない型のエラーを防ぎ、コードの安全性と可読性が高まります。PHP 8では、このような厳格な型指定が推奨されます。また、無名関数内でその外部の変数を参照したい場合は、function (...) use ($variable)のようにuseキーワードを使って変数を明示的にキャプチャする必要があります。これにより、より柔軟なデータ処理が可能になります。
PHP array_map で連想配列をマッピングする
1<?php 2 3/** 4 * array_map を使って連想配列を処理するサンプルコード 5 * 6 * この例では、商品ごとの価格と在庫を持つ2つの連想配列を使い、 7 * それらをマッピングして商品詳細情報を持つ新しい連想配列を生成します。 8 */ 9function createProductDetails(): void 10{ 11 // 商品ごとの価格情報を持つ連想配列 12 $prices = [ 13 'apple' => 150, 14 'orange' => 120, 15 'grape' => 300, 16 ]; 17 18 // 商品ごとの在庫情報を持つ連想配列 19 $stocks = [ 20 'apple' => 30, 21 'orange' => 50, 22 'grape' => 15, 23 ]; 24 25 // array_mapを使用して、2つの連想配列から新しい連想配列を生成します。 26 // コールバック関数の引数 $price には $prices の値が、 27 // $stock には $stocks の値が、同じキー('apple', 'orange'など)ごとに渡されます。 28 // 元の配列のキーは、結果の配列でも維持されます。 29 $productDetails = array_map( 30 fn(int $price, int $stock): array => ['price' => $price, 'stock' => $stock], 31 $prices, 32 $stocks 33 ); 34 35 // 生成された新しい連想配列を出力します 36 print_r($productDetails); 37} 38 39createProductDetails(); 40 41/* 42--- 実行結果 --- 43Array 44( 45 [apple] => Array 46 ( 47 [price] => 150 48 [stock] => 30 49 ) 50 51 [orange] => Array 52 ( 53 [price] => 120 54 [stock] => 50 55 ) 56 57 [grape] => Array 58 ( 59 [price] => 300 60 [stock] => 15 61 ) 62 63) 64*/ 65
PHPの array_map 関数は、配列の各要素に対して指定した処理を行い、その結果から新しい配列を作成して返す関数です。
第一引数には、各要素に適用する処理内容を定義したコールバック関数を指定します。第二引数以降には、処理対象となる配列を一つ以上指定します。
このサンプルコードでは、商品の価格情報を持つ $prices 配列と、在庫情報を持つ $stocks 配列という2つの連想配列を array_map に渡しています。array_map は、これら2つの配列から同じキー('apple'、'orange'など)を持つ値をペアで取り出し、コールバック関数の引数 $price と $stock にそれぞれ渡します。
コールバック関数は、受け取った価格と在庫の値を使って ['price' => ..., 'stock' => ...] という形式の新しい連想配列を生成して返します。array_map は、すべてのキーに対してこの処理を繰り返し、その結果をまとめて一つの新しい配列を生成します。このとき、元の連想配列のキーは、結果の配列にもそのまま維持されるのが特徴です。最終的に、商品名をキーとし、価格と在庫を値に持つ多次元連想配列が生成されます。
array_mapは、複数の連想配列を渡すと、同じキーを持つ値をペアにして処理できる便利な関数です。元の配列のキーは、処理後の配列にもそのまま引き継がれます。注意点として、渡した配列間でキーが一致しない場合、片方の配列にしか存在しないキーに対応する値は null として扱われます。サンプルコードのようにコールバック関数の引数に型を指定していると、null が渡された際にエラーが発生する原因となります。そのため、入力となる配列のキーが常に揃っていることを確認するか、コールバック関数内で null の場合の処理を考慮する必要があります。