array_searchを使用していた時に想定外の挙動をしていて調べていたら、下記のページに書いてあった。
array_searchに関して
配列の中で任意の値が存在するかを調べる関数。
$ary = [0, 1, 2, 3, 4];
$hoge = array_search(3, $ary);
print_r($hoge);
// => 3
$hoge = array_search(5, $ary);
// => false
注意点:文字列検索時の返り値
下記のような指定をすると値が返ってくる。
$ary = [0, 1, 2, 3, 4];
$hoge = array_search('hoge', $ary);
var_dump($hoge);
// => 0
array_searchは内部で ‘hoge’ == 0 の比較を行なっている。
そのため検索条件に合致して値が返ってくる。
参考:PHP 型の比較表
TRUE FALSE 1 0 -1 "1" "0" "-1" NULL array() "php" ""
"php" TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE
対応方法
array_searchの第3引数(strictモードの指定)にtrueを指定することで、’===’ を使用した厳密な比較(型及びオブジェクトが一致するかどうかの比較)を行う。
$ary = [0, 1, 2, 3, 4];
$hoge = array_search('hoge', $ary, true);
var_dump($hoge);
// => false
その他の注意点:返り値を使用したif文
array_searchでは == を使用した比較結果がtrueになることがあるため、if文で意図しない条件が通る可能性がある。
$ary = [0, 1, 2, 3, 4];
$hoge = array_search(0, $ary);
if ($hoge) {
echo 'match';
} else {
echo 'not match';
}
// => 'not match'
$hogeの値は配列の添え字である 0。
if文の分岐では0がfalseと同じ扱いになるため、’not match’ が出力される。
参考ページにも記載しているが、値の存在確認のみであればin_arrayを使用した方が良い。
$ary = [0, 1, 2, 3, 4];
$hoge = in_array(0, $ary);
if ($hoge) {
echo 'match';
} else {
echo 'not match';
}
// => 'match'
ただしin_arrayも ‘==’ による比較を行なっているため、厳密な比較を行う場合には同様にstrictモードを有効にする。