PHPのarray_mapの使い方: 配列の要素にコールバック関数を適用する
目次
- PHPのarray_mapの使い方
- PHPの対応バージョン
- array_mapの構造
- 普通の関数を適用する
- ラムダ関数を適用する
- 2つ以上の配列を処理する
- 複数の配列をzipする
- 連想配列を走査する
- 出題
PHPのarray_mapの使い方
PHPには配列の各要素にコールバック関数を適用し、新しい配列を作成する関数array_map
があります。
array_map
は↓のようにして使います。
<?php // 引数の値を倍にする関数 function double($x) { return $x * 2; } $arr = [1, 2, 3]; $result = array_map('double', $arr); // <- コールバック関数にdoubleを指定 var_dump($result) ?>
出力結果。
array(3) { [0]=> int(2) [1]=> int(4) [2]=> int(6) }
PHPの対応バージョン
PHP 4 >= 4.0.6
PHP 5
PHP 7
array_mapの構造
array_map
は↓のような構造を持っています。
array_map(コールバック関数, 配列1, 配列2, 配列n...)
第1引数にはコールバック関数を渡します。この関数に第2引数以降の配列の要素が順に渡されます。関数は返り値を返し、その返り値が新しい配列に格納されます。
コールバック関数にnull
を渡した場合、array_map
は引数の複数の配列を1つの配列にzip
します。
第2引数以降には走査対象の配列を渡します。配列は複数渡すことが出来ます。
array_map
の返り値はコールバック関数適用後の要素を含む新しい配列(array
)です。
複数の配列をarray_map
に渡した場合は、返り値の配列のキーは再構成されます。
普通の関数を適用する
array_map
に普通の関数を渡すには第1引数に文字列で関数名を渡します。
<?php // 引数の値を2乗する関数 function squared($x) { return $x * $x; } $arr = [1, 2, 3]; $result = array_map('squared', $arr); // <- コールバック関数にsquaredを指定 var_dump($result) ?>
出力結果。
array(3) { [0]=> int(1) [1]=> int(4) [2]=> int(9) }
squared
関数は引数の値を2乗する関数です。その関数をarray_map
の第1引数に指定しています。
array_map
は配列$arr
の走査を配列の先頭から開始し、取得した$arr
の要素をコールバック関数(squared
)に渡します。
squared
は引数の値を2乗して返し、その値は新しく作成される配列($result
)に格納されます。
ラムダ関数を適用する
PHP5.3.0
以降ではarray_map
にラムダ関数を渡すことが出来ます。
<?php // 引数の値を半分にするラムダ関数を作成 $half = function($x) { return $x / 2; }; $arr = [1, 2, 3]; $result = array_map($half, $arr); // <- ラムダ関数を渡す var_dump($result) ?>
出力結果。
array(3) { [0]=> float(0.5) [1]=> int(1) [2]=> float(1.5) }
2つ以上の配列を処理する
array_map
の引数に2つ以上の配列を渡した場合、コールバック関数の引数にはそれぞれの配列の要素が渡されます。
<?php // 引数$aと引数$bを掛け算する関数 // 引数$aには$arr1の要素、引数$bには$arr2の要素が渡される function mul($a, $b) { return $a * $b; }; $arr1 = [1, 2, 3]; $arr2 = [4, 5, 6]; $result = array_map('mul', $arr1, $arr2); // <- 配列を複数渡す var_dump($result) ?>
array(3) { [0]=> int(4) [1]=> int(10) [2]=> int(18) }
各配列の長さが異なる場合、array_map
は長い方の配列に合わせます。足りないほうの要素は0
で埋められます。
<?php // 引数$aと引数$bを足し算する関数 function add($a, $b) { return $a + $b; }; $arr1 = [1, 2]; // <- 要素が2つしかないので3つ目の要素が0埋めで作成される $arr2 = [3, 4, 5]; // <- こちらの方が長いのでこちらに合わせて処理される $result = array_map('add', $arr1, $arr2); var_dump($result) ?>
出力結果。
array(3) { [0]=> int(4) [1]=> int(6) [2]=> int(5) }
複数の配列をzipする
array_map
の第1引数をnull
にするとarray_map
は引数の配列をzip
します。
<?php $arr1 = [1, 2, 3]; $arr2 = [4, 5, 6]; $result = array_map(null, $arr1, $arr2); var_dump($result) ?>
出力結果。
array(3) { [0]=> array(2) { [0]=> int(1) [1]=> int(4) } [1]=> array(2) { [0]=> int(2) [1]=> int(5) } [2]=> array(2) { [0]=> int(3) [1]=> int(6) } }
連想配列を走査する
array_map
に連想配列を渡した場合、コールバック関数には連想配列の値が渡されます。
<?php // 引数$xの値を2倍にする関数 function double($x) { return $x * 2; } $arr = ['cat' => 1, 'dog' => 2]; $result = array_map('double', $arr); var_dump($result) ?>
出力結果。
array(2) { ["cat"]=> int(2) ["dog"]=> int(4) }
$arr
のキーの値が2倍になっているのがわかります。
出題
Q1: array_map
の第1引数に適当なものは何か答えよ
配列
関数
整数
Q2: array_map
に複数の配列が渡された場合の挙動を答えよ
コールバック関数に配列の要素が1つ渡される
コールバック関数に各配列の要素が渡される
コールバック関数にマージされた配列が渡される
Q3: array_map
の第1引数にnull
を指定した場合の挙動を答えよ
引数の配列をzipする
引数の配列をマージする
引数の配列の差分を取る
Q1: 2
Q2: 2
Q3: 1