PHPのarray_mapで無名関数を使う

PHPで配列に対して処理を行う場合はforeachを使うのが一般的ですが、array_mapを使うともっとシンプルに書くことができます。
array_map(関数名,配列)のようにして使います。
配列の各要素に関数を適用し結果を配列として返します。

基本

$a = array(1, 3, 5, 7);
$b = test1($a);
print_r($b);
function calc($x) {
  return $x * 2;
}
function test1($input) {
  return array_map("calc", $input);
}

結果は次のとおりです。

Array
(
    [0] => 2
    [1] => 6
    [2] => 10
    [3] => 14
)

まずcalcという処理用の関数を書きます。ここでは引数を2倍しています。
次にtest1という関数を書きます。「array_map(“calc”, $input)」のように引数に関数名と配列を与えます。関数名は文字列として与えます。
与えられた配列の各要素に対して処理用の関数が適用され、その結果が配列として返されます。
しかし処理用の関数を別に書くのでシンプルとは言いがたいです。

無名関数を使う

PHP5.3から無名関数を使うことができるようになったので、これを利用します。

$a = array(1, 3, 5, 7);
$b = test2($a);
print_r($b);
function test2($input) {
  return array_map(
    function($x) {
      return $x * 2;
    },
    $input
  );
}

処理用の関数を引数として直に書いています。「無名関数」なので関数名がありません。「function($x){return $x*2;}」が処理用の関数の部分です。これでも同じ結果になります。

複数の引数を使う

処理用の関数の引数を二つ以上使う場合はその分だけ配列を用意します。
次の例は配列の各要素同士を掛けています。

$a1 = array(1, 3, 5, 7);
$a2 = array(1, 2, 3, 4);
$b = test3($a1, $a2);
print_r($b);
function test3($input1, $input2) {
  return array_map(
    function($x, $y) {
      return $x * $y;
    },
    $input1,
    $input2
  );
}

結果は次のとおりです。

Array
(
    [0] => 1
    [1] => 6
    [2] => 15
    [3] => 28
)

「array_map(無名関数,配列,配列)」のように書きます。パラメーターとして配列を二つ指定しています。このとき無名関数の引数も二つ指定します。

変数を指定する

パラメーターが配列と配列の場合は上のように指定しますが配列と変数の場合はちょっと異なります。
次の例は配列の各要素に数を乗じます。この乗じる数をパラメーターとして与える場合はuseを使います。

$a = array(1, 3, 5, 7);
$v = 5;
$b = test4($a, $v);
print_r($b);
function test4($input, $value) {
  return array_map(
    function($x) use($value) {
      return $x * $value;
    },
    $input
  );
}

結果は次のとおりです。

Array
(
    [0] => 5
    [1] => 15
    [2] => 25
    [3] => 35
)

PHPでは原則としてfunctionの外で定義した変数は中では使えません。上の例では$valueが処理用の関数の中では使えません。中で使うためには「use($value)」とします。

コメント

  1. […] PHPには与えられた配列のそれぞれの要素に配列を適用して別の配列を作ったりする関数がいろいろとあります。 無名関数を使うとシンプルに書けるのでまとめてみました。 array_mapに無名関数を使う方法については前に書きましたが改めて挙げておきます。 […]

タイトルとURLをコピーしました