PHPのarray_mapの使い方: 配列の要素にコールバック関数を適用する

45, 2020-09-13

目次

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



この記事のアンケートを送信する