@suzu6

主にWEBと解析の技術について書きます。

広く浅くも続ければ深くなるはず。

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

  PHP

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
        )

)
*/

参考