PHPのarray_filterの使い方: 配列を走査してフィルタリングする
目次
- PHPのarray_filterの使い方
- PHPの対応バージョン
- array_filterの構造
- 奇数の整数のみをフィルタリングする
- コールバック関数を省略する
- 配列のキーをフィルタリングする
- 配列のキーと値をフィルタリングする
- ラムダ関数でフィルタリングする
- 出題
PHPのarray_filterの使い方
PHPには配列の要素をフィルタリングして新しい配列を作成する関数array_filter
があります。
array_filter
は↓のように使います。
<?php /** * 偶数のみを抽出するコールバック関数 */ function is_even($x) { return $x % 2 == 0; } $arr = [1, 2, 3, 4]; // 配列 $result = array_filter($arr, 'is_even'); // コールバック関数を指定して実行 print_r($result); // 結果を出力 ?>
出力結果。
Array ( [1] => 2 [3] => 4 )
PHPの対応バージョン
array_filter
は以下のPHPのバージョンで対応しています。
PHP 4 >= 4.0.6
PHP 5
PHP 7
array_filterの構造
array_filter
は↓のような構造を持っています。
array_filter(配列, コールバック関数, フラグ);
配列(第1引数)
第1引数の「配列」は処理対象の配列です。
array_filter
はここに指定された配列を先頭から走査していきます。
コールバック関数(第2引数)
第2引数の「コールバック関数」には関数を指定します。
このコールバック関数は真偽値に相当するオブジェクトを返す必要があります。
このコールバック関数の返り値がTRUE
とみなせればarray_filter
は処理中の要素を結果の配列に保存し、FALSE
とみなせれば処理中の要素を結果の配列から取り除きます。
コールバック関数が指定されなかった場合、array_filter
はFALSE
と判断できる要素を結果の配列から取り除きます。
フラグ(第3引数)
第3引数のフラグは、コールバック関数に引数として何を渡すのか指定するためのフラグです。
フラグに使用できる定数は以下があります。
ARRAY_FILTER_USE_KEY
ARRAY_FILTER_USE_BOTH
ARRAY_FILTER_USE_KEY
は、値ではなくキーだけをコールバック関数に渡します。
ARRAY_FILTER_USE_BOTH
は、値だけではなく、値とキーの両方をコールバック関数に渡します。
第3引数のフラグを省略した場合は通常通り値のみがコールバック関数に渡されます。
返り値
array_filter
の返り値は新しく作成されたフィルターを適用後の配列です。
フィルタリングでは要素のキーは保持されます。
奇数の整数のみをフィルタリングする
整数の入った配列から奇数の整数のみを抜き出します。
<?php /** * 奇数のみを抽出するコールバック関数 */ function is_odd($x) { return $x % 2; } $arr = [1, 2, 3, 4]; // 配列 $result = array_filter($arr, 'is_odd'); // コールバック関数を指定して実行 print_r($result); // 結果を出力 ?>
出力結果。
Array ( [0] => 1 [2] => 3 )
結果の配列のキーがそのままになっていることに注目してください。
array_filter
はキーを維持してフィルタリングを実行します。
コールバック関数を省略する
array_filter
はコールバック関数を省略するとTRUE
とみなせる要素のみを結果の配列に格納します。
<?php $arr = [0, 1, 0, 2]; // 配列 $result = array_filter($arr); // コールバック関数を省略 print_r($result); // 結果を出力 ?>
出力結果。
Array ( [1] => 1 [3] => 2 )
0
はFALSE
とみなせるので↑の場合、結果の配列には格納されません。
配列のキーをフィルタリングする
array_filter
の第3引数にARRAY_FILTER_USE_KEY
を指定すると、配列のキーのみをコールバック関数内で処理できます。
↓はキーがcat
の要素のみを結果の配列に残すコードです。
<?php /** * キーが'cat'の要素を抽出するコールバック関数 */ function keep_cat($key) { return $key === 'cat'; } $arr = ['cat' => 'nyan', 'dog' => 'wan']; // 連想配列 $result = array_filter($arr, 'keep_cat', ARRAY_FILTER_USE_KEY); print_r($result); // 結果を出力 ?>
出力結果。
Array ( [cat] => nyan )
配列のキーと値をフィルタリングする
array_filter
の第3引数にARRAY_FILTER_USE_BOTH
を指定すると、配列のキーと値をコールバック関数内で処理できます。
↓はキーがcat
, 値がnyan
の要素のみを結果の配列に残すコードです。
コールバック関数に渡される引数の順番が「値, キー」になっていることに注意してください。
<?php /** * 値が'nyan'でかつキーが'cat'の要素のみを抽出するコールバック関数 */ function keep_cat_and_nyan($val, $key) { return $val === 'nyan' && $key === 'cat'; } $arr = ['cat' => 'nyan', 'dog' => 'wan']; // 配列 $result = array_filter($arr, 'keep_cat_and_nyan', ARRAY_FILTER_USE_BOTH); print_r($result); // 結果を出力 ?>
出力結果。
Array ( [cat] => nyan )
ラムダ関数でフィルタリングする
PHP5.3
以降からラムダ関数をarray_filter
のコールバック関数に指定することができます。
<?php /** * 値が2より下の要素だけを抽出するコールバック関数 */ $under_two = function ($x) { return $x < 2; }; $arr = [0, 1, 2, 3]; // 配列 $result = array_filter($arr, $under_two); // ラムダ関数を指定して実行 print_r($result); // 結果を出力 ?>
出力結果。
Array ( [0] => 0 [1] => 1 )
出題
Q1: array_filter
の第1引数として適当なものを答えよ
配列
関数
フラグ
Q2: array_filter
のコールバック関数の返り値として適当なものを答えよ
boolean
integer
string
Q3: array_filter
のコールバック関数にキーと値を渡したいときに適当なフラグを答えよ
ARRAY_FILTER_USE_KEY
ARRAY_FILTER_USE_BOTH
ARRAY_FILTER_USE_VALUE
正解
Q1: 1
Q2: 1, 2, 3
Q3: 2