こんにちは。ITベンチャー企業でWebエンジニアをしている雅です。
PHPの配列を学んでいて、ある条件に合致した要素のみを抽出した配列を作成したいと思ったことはありませんか?
PHPでの配列の操作となると、
foreach関数は知ってるけど、もっと効率の良いフィルタリングはできないのかな?
と疑問に思った人もいると思います。
PHPには配列の要素の抽出に最適なarray_filter関数というものがあります。そこでこの記事では、指定した条件に沿った要素のみを抽出するarray_filter関数を使ったフィルタリングの方法を紹介していきます!
PHPを学んだばかりの方や、配列操作の勉強をしている人にためになる記事となっているので、ぜひ参考にしてみてください!
目次
配列の要素をフィルタリングするには?
配列からある条件に合致した要素だけを排除して残りの要素だけを抽出した配列を作成したい時など、配列をフィルタリングする際に最適な組み込み関数としてarray_filterがあります。
組み込み関数(ビルドイン関数)とは、各プログラミング言語であらかじめ用意されている関数で、自分で実装することなく初めから使用することができます!
何はともあれ、まずはarray_filterの基本構文から確認していきましょう!
array_filterの使い方
array_filterは3つの引数を指定することができます。第一引数にはフィルタリングする配列、第二引数にはフィルタリングの条件を記載するコールバック関数、3つ目はflagというコールバック関数に配列の何を送るかを表す文字列を指定することができます。
コールバック関数とは、他の関数に引数として渡す関数のことで、通常、array_filterとは別で関数の定義をして使用します。
1 |
array_filter($配列, 'コールバック関数', $flag) |
array_filterは戻り値として、フィルタリングされた配列を返します。ちなみに第三引数のflagの指定は強制ではないので、指定しなくても動作します。
array_filterの使用例
ここでは実際のプログラムを使ってarray_filterの動作を見ていきましょう。
先ほどの使い方に従うと、array_filterを使うにはフィルタリング対象の配列、コールバックで呼び出す関数の2つが最低限必要になります。
array_filterの実装例
今回は1~10の数値が格納された配列から奇数をフィルタリングして偶数の値のみを抽出した配列を出力するプログラムを紹介します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php // コールバック関数 function toEven ($value){ return ($value % 2 == 0); } // 配列 $array = [1,2,3,4,5,6,7,8,9,10]; // フィルタリング $isFiltered = array_filter($array, 'toEven'); print_r($isFiltered); ?> |
1 2 |
実行結果 Array ( [1] => 2 [3] => 4 [5] => 6 [7] => 8 [9] => 10 ) |
見事に$arrayから偶数の値だけ抽出できましたね。
サンプルプログラムの流れとしては、array_filterに入れた$arrayの配列の各値をtoEven関数に送ります。toEven関数の$valueには$arrayから送られた値が順に代入され、2で割った余りが0、すなわち偶数のみをreturnします。
そしてtoEven関数の返り値を$isFilteredに入れ、print_rで出力しています。使い方は非常にシンプルですね。
array_filterでコールバック関数を指定する際には関数名を「’’」や「””」といった引用符で囲むことを忘れないように気をつけましょう。
配列のNULLを削除する
array_filterを使う主な場面の一つとして、配列からnull(空の値)をフィルタリングすることが多々あります。
今回はこのnullをフィルタリングするプログラムも紹介します。
null要素のフィルタリングは複数ありますが、コールバック関数に組み込み関数のstrlen関数を使うとスムーズにフィルタリングできます。
1 2 3 4 5 6 7 8 |
<?php $array = [1,null,3,null,5,6,null,null,null,10]; // $arrayのNullをフィルタリング $isFiltered = array_filter($array, 'strlen'); print_r($isFiltered); ?> |
1 2 |
実行結果 Array ( [0] => 1 [2] => 3 [4] => 5 [5] => 6 [9] => 10 ) |
ここで
あれ?strlenってこんな使い方だっけ?
と思った方もいるかもしれません。
その疑問は間違ってないですよ!
strlen関数は本来、文字列の長さを測る関数になります。
strlen関数は引数の文字列が測れる場合はその文字列の長さを、測れない場合はFalseになるという仕様があります。それを利用して、長さを図ることができる値のみreturnするという仕組みで実現しています。
連想配列をフィルタリングする
続いて、キーが文字列の連想配列をフィルタリングする方法を解説していきます。
今回はキーが名前で値が年齢の連想配列から20歳未満の名前を削除するプログラムを紹介します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php // コールバック関数 function overTwenty($value){ return($value >= 20); } // 配列 $student_age = ['Eric'=>23,'John'=>19,'Michel'=>20,'Peter'=> 17]; // $student_ageから20未満をフィルタリング $isFiltered = array_filter($student_age,'overTwenty'); print_r($isFiltered); ?> |
1 2 |
実行結果 Array ( [Eric] => 23 [Michel] => 20 ) |
連想配列においても使い方は変わらないということがわかりましたね!
flagを設定しよう
さて、この記事のはじめにarray_filterは第三引数にflagという文字列を指定できるとお話ししました。flagとは何かをもう一度説明すると、コールバック関数に配列の何を送るかを指定するものです。「配列の何」とは、キーや値のことです。
通常、第三引数を指定せずにarray_filterを使用すると、コールバック関数には配列の値のみをコールバック関数に送る設定になっています。ですが第三引数のflagを指定すると、配列のキーのみを送る、またはキーと値の両方を送るという設定に変更することができます。
Flagに指定できる文字列は2つあります。
- ARRAY_FILTER_USE_KEY:配列のキーのみをコールバック関数に送る。
- ARRAY_FILTER_USE_BOTH:配列のキーと値の両方をコールバック関数に送る。
それぞれのサンプルプログラムで使用例を見ていきましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php // コールバック関数 function findAge($key){ return($key == 'John'); } // 配列 $student_age = ['Eric'=>23,'John'=>19,'Michel'=>20,'Peter'=> 17]; // キーがJohn以外の要素をフィルタリング $isFiltered = array_filter($student_age,'findAge',ARRAY_FILTER_USE_KEY); print_r($isFiltered); ?> |
1 2 |
実行結果 Array ( [John] => 19 ) |
上のサンプルプログラムはflagにARRAY_FILTER_USE_KEYを指定した例です。
配列から、キーが「John」の要素だけを抽出して$isFilteredに格納しています。実行結果もしっかりと「John」のキーと値の19が出力されていますね!
この記事の一番初めのサンプルでは配列の値をコールバック関数に送っていましたが、このようにflagを指定することで配列のキーをフィルタリング対象にすることもできます。
続いてflagにARRAY_FILTER_USE_BOTHを指定した場合のサンプルプログラムを見ていきましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php // コールバック関数 function findStudent($value,$key){ return($key == 'John' || $value > 20); } // 配列 $student_age = ['Eric'=>23,'John'=>19,'Michel'=>20,'Peter'=> 17]; // キーがJohn以外の要素をフィルタリング $isFiltered = array_filter($student_age,'findStudent',ARRAY_FILTER_USE_BOTH); print_r($isFiltered); ?> |
1 2 |
実行結果 Array ( [Eric] => 23 [John] => 19 ) |
今回はキーが「John」の要素、または値が20より大きい要素のみを抽出し、それ以外の要素をフィルタリングしています。
flagにARRAY_FILTER_USE_BOTHを指定した場合は、コールバック関数には配列のキーと値の両方が送られるので、コールバック関数の引数も2つ用意しなくてはいけません。
ARRAY_FILTER_USE_BOTHを指定した場合は、コールバック関数の第一引数に配列の値が、第二引数に配列のキーがそれぞれ送られます。
配列は「キー => 値」が基本です。コールバック関数の引数で逆になることに注意してください。
まとめ
今回はPHPのarray_filterを使った基本的な配列のフィルタリング方法を解説しました。また、第三引数にflagを指定すればより高度なフィルタリングをすることも可能になります!
フィルタリングの用途によってflagを使い分けられるようにしておくといいですね!
array_filterはPHPでよく使用する関数の一つでもあるので、いつでも使えるようにしておきましょう!