PHPの配列に関数を適用して操作する関数

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

array_map

配列の各要素に関数を適用した結果を配列として返す。
array_map(関数,配列)として使う。

$a=array(1,2,3,4,5);
$b=array_map(
  function($x){
    return $x % 2;
  },
  $a);
print_r($b);

結果は次のとおり。

Array
(
    [0] => 1
    [1] => 0
    [2] => 1
    [3] => 0
    [4] => 1
)

2で割った余りを返す。

array_filter

配列の各要素に関数を適用しtrueとなる要素だけを抽出し配列として返す。
array_filter(配列,関数)として使う。

$a=array(1,2,3,4,5);
$b=array_filter(
  $a,
  function($x){
    return ($x % 2 == 0);
  });
print_r($b);

結果は次のとおり。

Array
(
    [1] => 2
    [3] => 4
)

2で割った余りが0となる要素だけを返す。
array_mapの引数は「関数,配列」の順で、array_filterは逆に「配列,関数」の順であることに注意する。
連想配列ならばキーは維持される。通常の配列は「歯抜け」になる。

array_reduce

初期値に対し配列の各要素を使い関数を適用し結果を返す。
array_reduce(配列,関数,初期値)として使う。

$a=array(1,2,3,4,5);
$b=array_reduce(
  $a,
  function($x,$y){
    $x += $y;
    return $x;
  },
  10);
print_r($b);

結果は次のとおり。

25

初期値10に対して配列の要素1,2,3,4,5を次々に加えていく。つまり10+1+2+3+4+5を計算している。
使い道が分かりにくいが例えば次のように使う。

$a=array(array(1,2),array(3,4),array(5,6));
$b=array_flatten($a);
function array_flatten($input){
  return array_reduce(
    $input,
    function($x,$y){
      return array_merge($x,$y);
    },
    array());
}
print_r($b);

「array_flatten」という関数を作っている。flattenというのはlodashで知った。二次元の配列を一次元にして平らにするという意味らしい。
初期値に空の配列を指定し、それに配列をマージしていく。
array()にarray(1,2)をマージしてarray(1,2)にする。これにarray(3,4)をマージしてarray(1,2,3,4)にする。これを繰り返すとフラットになる。

コメント

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