PHPのarray_mapの使い方: 配列の要素にコールバック関数を適用する
- 作成日: 2020-09-13
- 更新日: 2023-12-24
- カテゴリ: PHP
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