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
)
)
*/
参考
PHP Warning Illegal string offset 'foo'
PHPschedule2020-02-03
PHP Notice:Undefined indexの対処
PHPschedule2020-01-17
PHP compact関数で宣言していない変数の扱い
PHPschedule2020-01-15