schedule2019-05-21

配列をフィルタリングするarray_filterのサンプル|PHP

array_filterで配列をフィルタリングできます。 気に入ったのでサンプルをいくつか作成しました。

  • 動作確認:PHP 7.3
  • array_filterの実行可能バージョン: (PHP 4 >= 4.0.6, PHP 5, PHP 7)

配列のフィルタリング

配列の中から目的の条件に合致した要素を取り出します。 PHPのarray_filterSQLのWHEREやPythonのfilter()にあたります。

array_filterを使って偶数を取り出すコードを書いてみます。

// 0から10までの整数
$list = range(0, 10);

// フィルタリング
$even = array_filter($list, function($num) {
    // 条件
    return $num % 2 === 0;
});

print_r($even);
/* 出力
Array
(
    [0] => 0
    [2] => 2
    [4] => 4
    [6] => 6
    [8] => 8
    [10] => 10
)
*/

return $num % 2 === 0;ここで条件に合致した要素だけを取り出すことができます。

foreach文を使った方法

上のコードをforeachを使って書くと以下のようになる。

$list = range(0, 10);

// 配列として宣言
$even = array();

foreach($list as $num){
    if($num % 2 === 0){
        // 末尾に追加
        $even[] = $num;
    }
}

print_r($even);
/* 出力
Array
(
    [0] => 0
    [1] => 2
    [2] => 4
    [3] => 6
    [4] => 8
    [5] => 10
)
*/

あらかじめ配列を宣言したり配列に追加する処理を書く必要があり、filter_map()を使ったコードと比べて冗長です。 そのため、注力したい条件の部分が分かりずらくなっています。 また、インデックスが異なるため元配列から参照できなくなっています。

フィルタリングのコードサンプル

条件式を変えるだけですが、いくつか有用そうなサンプルを置いておきます。

渡している配列は指定がなければint型の配列です。

奇数・偶数

// 奇数
$odd = array_filter($list, function($num) {
    return $num % 2 !== 0;
});
// 偶数
$even = array_filter($list, function($num) {
    return $num % 2 === 0;
});

閏年の判定

$leap_years = array_filter($years, function($year) {
    return date('L', mktime(0,0,0,1,1,$year));
});

閾値

連想配列のフィルタリングは結構使うかもしれません。

$users = array(
    array('name' => 'suzu', 'age' => 28),
    array('name' => 'taro', 'age' => 30),
    array('name' => 'kenzo', 'age' => 40),
);

// 30歳以上
$over30 = array_filter($users, function($user) {
    return $user['age'] >= 30;
});

print_r($over30);
/*
Array
(
    [1] => Array
        (
            [name] => taro
            [age] => 30
        )

    [2] => Array
        (
            [name] => kenzo
            [age] => 40
        )

)
*/

参考