PHPのin_arrayは、ある文字列や数字が配列に含まれるかどうかをチェックする関数です。便利でよく使う関数ですが、第三引数にtrueを設定しないと予期しない動作が起こりやすくなるので、trueにすべきだということについて解説します。
目次
そもそもin_arrayとは
in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] ) : bool
haystack 内の needle を検索します。 strict が設定されていない限りは型の比較は行いません。
in_array(探したい文字列(数値も可) , 探索対象の配列, 厳密な比較にするか)という使い方をします。
第三引数がfalseのままだとどうなる?
結論からいうと、配列の中身と文字列を比較する際に、ゆるい比較を行ってしまうので予期しない挙動が発生します。
例
$arr = ['けいた']; if (in_array(0, $arr, false)){ echo '0が$arrに含まれる'; } else { echo '0が$arrに含まれない'; } //結果 // 0が$arrに含まれる
第三引数はデフォルトでfalseですが、分かりやすくするためにあえて書きました。
さて、$arrには文字列の’けいた’が入っています。もちろん、数字の0とは似ても似つかないものなので、in_arrayで比較を行うとfalseになるはずです。
しかし、上の例ではtrueという結果になり「0が$arrに含まれる」という結果を得ることになりました。それはなぜでしょうか?
それは第三引数がfalseだとゆるい比較を行うので、’けいた’が自動キャストされて数字の0になってしまうからなのです。このように、in_arrayの第三引数をfalseにしてしまうと、別の型同士を比較したときに予想外の挙動を示すことがあります。
第三引数はtrueにして型の比較まで行おう
$arr = ['けいた']; if (in_array(0, $arr, true)){ echo '0が$arrに含まれる'; } else { echo '0が$arrに含まれない'; } //結果 //0が$arrに含まれない
PHPなどの動的型付け言語では、変数が自動キャストされて思わぬ比較結果になってしまうことがあるのです。そのため、in_arrayを使うときは第三引数をtrueにして型の比較まで行うほうが確実です。
ただし、自動キャストがされなくなるので、数字の0と文字列の’0’が別のものとして認識されることには気をつけておきましょう。