ユーニックス総合研究所

  • home
  • archives
  • php-array-map

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引数に適当なものは何か答えよ

  1. 配列
  2. 関数
  3. 整数

Q2: array_mapに複数の配列が渡された場合の挙動を答えよ

  1. コールバック関数に配列の要素が1つ渡される
  2. コールバック関数に各配列の要素が渡される
  3. コールバック関数にマージされた配列が渡される

Q3: array_mapの第1引数にnullを指定した場合の挙動を答えよ

  1. 引数の配列をzipする
  2. 引数の配列をマージする
  3. 引数の配列の差分を取る

Q1: 2
Q2: 2
Q3: 1