gistでPHPのコードを読んでいたらこんな個所があった。
$array = array_filter(explode(' ', $value));
$value
には aaa bbb ccc
みたいなテキストが入ってる。なので explode
をつかって $value
をスペースごとに分割して配列にするところまでは分かる。(explode
については PHP: explode - Manual を参照)
こんな感じのコードを書いて、
<?php $value = 'aaa bbb ccc'; $array = explode(' ', $value); var_dump($array);
実行するとこうなるんだよね。わかる。 aaa bbb ccc
が explode
で分割されて配列になった。
array(3) { [0]=> string(3) "aaa" [1]=> string(3) "bbb" [2]=> string(3) "ccc" }
でもこれにさらに array_filter
かけても、
<?php $value = 'aaa bbb ccc'; $array = array_filter(explode(' ', $value)); var_dump($array);
実行結果はまったく同じ…んんん? array_filter
なにしてるんだ…?( array_filter
についてはこちら PHP: array_filter - Manual を参照)
$ php test.php array(3) { [0]=> string(3) "aaa" [1]=> string(3) "bbb" [2]=> string(3) "ccc" }
array_filter
って 第2引数に「奇数だったらtrueを返すメソッド」みたいなのを指定して、配列の中から奇数の要素だけをフィルタリングする
的なメソッドだと思ってたので、そもそも第2引数が指定されてないと何してるの…?と。
うーんうーんと考えた結果、恐らく次の2つのケースのときに array_filter
が役に立つから使ってるんじゃないかな?と推察したので書いておく。
ケース1. $value
が空文字だったときに empty
の結果が変わる
次のように $value
が空文字だった場合、
<?php $value = ''; $array = explode(' ', $value); var_dump($array); var_dump(empty($array)); $array = array_filter(explode(' ', $value)); var_dump($array); var_dump(empty($array));
explode
だけだと配列に「値が空の要素」が1件入るけど、 array_filter
を組み合わせれば要素は0件になる。
array(1) { [0]=> string(0) "" } bool(false) array(0) { } bool(true)
こういうケースなら empty
で空かどうかチェックしたときの結果が true
と false
で分かれるので、 array_filter
がいる意味わかるー。( empty
についてはこちら PHP: empty - Manual を参照)
ケース2. $value
にスペースが沢山あったときに詰められる
あとは aaa bbb ccc
みたいに $value
にスペースがたくさんあったとき!
こういうときも explode
だけだと要素数が7つになっちゃうけど、array_filter
を通せばフィルタリングされて値のある3つだけになる。
<?php $value = ' aaa bbb ccc'; $array = explode(' ', $value); var_dump($array); var_dump(count($array)); $array = array_filter(explode(' ', $value)); var_dump($array); var_dump(count($array));
array(7) { [0]=> string(0) "" [1]=> string(3) "aaa" [2]=> string(0) "" [3]=> string(3) "bbb" [4]=> string(0) "" [5]=> string(0) "" [6]=> string(3) "ccc" } int(7) array(3) { [1]=> string(3) "aaa" [3]=> string(3) "bbb" [6]=> string(3) "ccc" } int(3)
こういうケースでも array_filter
は有用そう!
ただし false
や null
があるときには要注意
explode
で配列にしたときは、要素はすべて「文字列」として値に入るので、例えば -1 false null
を渡した際に、
<?php $value = '-1 false null'; $array = explode(' ', $value); var_dump($array); $array = array_filter(explode(' ', $value)); var_dump($array);
こんな感じで array_filter
を通しても全く問題ないのですが、
array(3) { [0]=> string(2) "-1" [1]=> string(5) "false" [2]=> string(4) "null" } array(3) { [0]=> string(2) "-1" [1]=> string(5) "false" [2]=> string(4) "null" }
配列に null
やbooleanの false
が入る場合は注意が必要そう。
<?php $value = [ -1, false, null ]; var_dump($value); $array = array_filter($value); var_dump($array);
実行してみると、こんな感じでさらっと false
や null
の要素がフィルタリングされて消えたー。
array(3) { [0]=> int(-1) [1]=> bool(false) [2]=> NULL } array(1) { [0]=> int(-1) }
-1
みたいなの負の数は消えないんだね。なるほど。
こういう「人が書いたコードの意図や、どんなケースを想定しているのかを考える」のは楽しいなー。
なお上記は CentOS 6.10
の PHP 5.6.40
のCLI環境で確認しました。