【PHP】array_filterを使ってスマートに配列を抽出する方法




この記事では、array_filterを使って条件にマッチした要素を配列から抽出する方法について紹介します。PHPを使っていると、配列(連想配列)から要素を取り出したいときが良くありますよね。

そんなときに役に立つのがarray_filterです。引数にコールバック関数を使うので難しそうに見えますが、慣れれば簡単ですし、汎用性が抜群に高いのが特徴です。

目次

array_filterについて

array_filter ( array $array [, callable $callback [, int $flag = 0 ]] ) : array

PHP: array_filter – Manual

array_filterはその名の通り、配列arrayを特定の条件でフィルタリングして、条件にマッチした要素を配列として返します。

  • 第1引数 $arrayは、filterを適応させる配列です。
  • 第2引数$callbackは、filter用の関数です。
  • 第3引数は、引数として何を callback に送るのかを決めるフラグです。省略すると「値」だけが送られ、ARRAY_FILTER_USE_KEYを書くと「キー」だけが送られ、ARRAY_FILTER_USE_BOTHを書くと「キー」と「値」が送られます。

array_filterの使用例

例1:コールバック関数をあらかじめ定義しておくパターン

<?php

function extractWoman($element) {
  return $element['sex'] == 'woman';
}

$array = [
  [
    'name' => 'Keita',
    'sex' => 'man',
    'birth_month' => 11,
  ],
  [
    'name' => 'Miho',
    'sex' => 'woman',
    'birth_month' => 13,
  ],
  [
    'name' => 'Yuri',
    'sex' => 'woman',
    'birth_month' => 11,
  ],
];

$result = array_filter($array, "extractWoman");

あらかじめextractWomanという、配列から女性の情報だけを取り出す関数を用意します。

そして、第1引数に$arrayを、第2引数に”extractWoman”を指定すると、$arrayから男であるKeitaの情報が落ちた状態で$resultに代入されます。

例2:コールバック関数を即興で書くパターン

<?php

$array = [
  [
    'name' => 'Keita',
    'sex' => 'man',
    'birth_month' => 11,
  ],
  [
    'name' => 'Miho',
    'sex' => 'woman',
    'birth_month' => 13,
  ],
  [
    'name' => 'Yuri',
    'sex' => 'woman',
    'birth_month' => 11,
  ],
];

$result = array_filter($array, function($element){
  return $element['sex'] == 'woman';
});

また、コールバック関数をarray_filterの引数部分に直接書くことも可能です。1度しか使わない場合はこちらのほうがスッキリして良いですね。

array_filterの注意点

array_filterについて、注意点があります。それは変数のスコープについてです。コールバック関数内で外部の変数を使う場合は、use()で外部変数を指定する必要があります。

<?php 

$max = 10;
$array = [2, 9, 11, 20, 33];

$result = array_filter($array, function($element) {
  return $element > $max; //$maxがUndefined valuableエラーになる
});



$max = 10;
$array = [2, 9, 11, 20, 33];

$result = array_filter($array, function($element) use($max) {
  return $element > $max; //OK
});

まとめ

array_filterは、フィルター条件を自作できるので、汎用性が高いことを感じていただければ幸いです。これをスマートに使いこなせるとかっこいいと思いました。