[PHP] array_filter とは

覚えなくてもいいが、覚えると少しクールに書ける array_filter 。

PHPの仕様だと以下のように書いてあります。

array array_filter ( array $array [, callable $callback [, int $flag = 0 ]] )

array_fileterは、配列に条件を与えて、絞り込んだ配列を返すのが目的です。
なので、最初の配列の中に入っているものと違うものが返ってくることは無いです。

簡単な使い方。

0より大きい数字のみの配列にします。

$simpleArr = [1, 2, -1, 3, 0 -4];

$tmpArr = array_filter($simpleArr, 'higherThanZero');
print_r($tmpArr);

function higherThanZero($val){
	if($val > 0) {
		return true;
	}
}

出力

Array
(
    [0] => 1
    [1] => 2
    [3] => 3
)

第1引数に配列、第2引数に関数名。

関数の引数に次々と配列の中身が渡されます。

条件のtrueが返ったものだけが、配列に残ります。

foreachだと

array_filterはforeachに置き換えれます。

$tmpArr = [];
foreach ($simpleArr as $key=>$val){
	if($val > 0){
		$tmpArr[$key] = $val;
	}
}
print_r($tmpArr);

 

匿名関数で記述する

今の例だと、foreachのほうが短くて分かりやすい気がします。

そこで、一度しか使わないかもしれない関数を宣言せずに、匿名関数としてその場で宣言した書き方にします。

$tmpArr = array_filter($simpleArr, function($var){
	if($var > 0) {
		return true;
	}
});
print_r($tmpArr);

 

キーも渡す[PHP5.6以上]

条件式の引数に値しか渡していませんが、例えば、連想配列のキーで判断したい場合などは、第3の引数に、ARRAY_FILTER_USE_BOTH を追記します。
(PHP5.6以降でないと使えません)

$simpleArr = ['banana'=>1, 'apple'=> 2, 'strawberry'=>0, 'pineapple'=>4];

$tmpArr = array_filter($simpleArr, function($val, $key){
	if($key == 'banana' || $key == 'strawberry') {
		if($val > 0){
			return true;
		}
	}
}, ARRAY_FILTER_USE_BOTH);
print_r($tmpArr);

上の例は、bananaかstrawberryのうち、0より大きい数字を返します。

Array
(
    [banana] => 1
)

 

あと、あまり使わない気がしますが、ARRAY_FILTER_USE_KEY にすると、引数にキーだけを渡します。

$simpleArr = ['banana'=>1, 'apple'=> 2, 'strawberry'=>0, 'pineapple'=>4];

$tmpArr = array_filter($simpleArr, function($key){
	if($key == 'banana' || $key == 'strawberry') {
		return true;
	}
}, ARRAY_FILTER_USE_KEY);
print_r($tmpArr);

 

array_valuesでキーを並び替える。

お気づきの通り、array_fileterはキーを保持します。

連想配列などは、キーを保持するのに都合がいいのですが、配列だと、キーを再度振り直したい場合があると思います。

その場合は、array_baluesで配列を作り直します。

$simpleArr = [1, 2, -1, 3, 0 -4];

$tmpArr = array_filter($simpleArr, function($var){
	if($var > 0) {
		return true;
	}
});
$tmpArr = array_values($tmpArr);
print_r($tmpArr);

先ほどは、0, 1, 3 となっていたのが、キーが詰められます。

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
)

 

まとめ

正直、普通のforeachで十分だと思います。

array_filterより、foreachのほうが、関数呼び出しが無いので速度も速く、PHPの熟練者でなくても読めるので。

じゃぁ、いつ使うか。

foreachより読みやすいと感じた場所で使うのかな・・・。

 

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>