24
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【PHP】array_filterの色々な書き方

Last updated at Posted at 2021-01-16

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かなと思っています。
新しい記法見つけたら、追記していきます。

参考

コールバック/Callcable(公式)

24
19
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?