[PHP]array_searchではstrictモードを使用する

array_searchを使用していた時に想定外の挙動をしていて調べていたら、下記のページに書いてあった。

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モードを有効にする。

array_search

カテゴリーPHP

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

eleven − eleven =

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください