array_filterとは
array_filter(array $array, callable|null $callback = null, int $mode = 0): array
(PHP 4 >= 4.0.6, PHP 5, PHP 7)
array_filter
コールバック関数を使用して、配列の要素をフィルタリングする
公式より
配列を非破壊的にフィルターするPHPの内部関数です
パターン 1 (コールバック関数)
$arr = ['a', 'b'];
$res = array_filter($arr, function($val) {
return $val === 'a';
});
// ['a']
【メリット】
・一番王道(多分)
・読みやすい
・関数名を考えなくてよい
【デメリット】
・条件式を再利用することができない
パターン 2 (クロージャ)
$arr = ['a', 'b'];
$func = function($val) {
return $val === 'a';
};
$res = array_filter($arr, $func);
// ['a']
【メリット】
・関数($func)のスコープを狭めることができる
【デメリット】
・見慣れていない人にとっては読みにくい
・func内で、スコープ外の変数を扱う時に必要
(useは変数が定義された時の値となるため)
パターン 3 (関数)
$arr = ['a', 'b'];
function func($val) {
return $val === 'a';
}
$res = array_filter($arr, 'func');
// ['a']
【メリット】
・同じ条件でフィルターしたい時、関数を再利用することができる
【デメリット】
・関数をグローバルに定義している、汚染しないような工夫が必要
パターン 4 (クラスのメリット)
class Filter {
public function func($val) {
return $val === 'a';
}
}
$arr = ['a', 'b'];
$obj = new Filter;
$res = array_filter($arr, [$obj, 'func']);
// or
$res = array_filter($arr, [new Filter, 'func']);
// ['a']
【メリット】
・フィルター用のクラス(関数群)を用意することができる
【デメリット】
・呼び出し元でnewが必要
・クラスの中身を見ないと、条件式が見れない
パターン 5 (クラスの静的メソッド)
class Filter {
public static function func($val) {
return $val === 'a';
}
}
$arr = ['a', 'b'];
$res = array_filter($arr, 'Filter::func');
// or
$res = array_filter($arr, ['Filter', 'func']);
// ['a']
【メリット】
・フィルター用のクラス(関数群)を用意することができる
【デメリット】
・クラスの中を見ないと、条件式が見れない
パターン 6 (マジックメソッド __invoke())
class Filter {
public function __invoke($val) {
return $val === 'a';
}
}
$arr = ['a', 'b'];
$res = array_filter($arr, new Filter);
// ['a']
【メリット】
・呼び出し元での、コード量が少ない
【デメリット】
・フィルター用に1つクラスを用意することになる
パターン 7 (アロー関数)
$arr = ['a', 'b'];
$res = array_filter($arr, fn ($val) => $val === 'a');
// ['a']
【メリット】
・コード量が少ない
・JavaScriptを書いている人にとっては、読みやすいかも?
【デメリット】
・php 7.4以上でないと使えない
・コールバック関数(パターン1)より遅いらしい
※コメントにも書きましたが、早い時と遅い時があるようです
パターン おまけ(null)
$arr = ['a', ''];
$res = array_filter($arr);
// ['a']
空を取り除いてくれます。内部的にはempty()
を行っています。
おわりに
調べてみたら奥が深かったです。
よほどのことがない限り、パターン1,2かなと思っています。
新しい記法見つけたら、追記していきます。