PHPのin_arrayでtrue,falseが正しく判定されないことがありました。
結論から言うと暗黙の型変換がかかっているためです。
in_array(“hoge”, [0,1,2], true)
のように第三引数にtrueを渡せば解決できます。
たとえば下記はすべて1(=true)となります。
in_array("hoge", [0,1,2]) -> 1 in_array("", [0,1,2]) -> 1 in_array(0, ["foo","bar"]) -> 1
[0,1,2]に”hoge”なんて含まれてませんけどね。
PHPエンジニアであれば下記がtrueになることは意識してるかと思います。
("" == 0) -> 1 ("0" == 0) -> 1 (null == 0) -> 1 (false == 0) -> 1
型変換せずに比較したい場合は===, !==を使用しますね。
("" === 0) -> ("0" === 0) -> (null === 0) -> (false === 0) ->
しかし、↓もtrueになってしまいます。
数値と比較するために”hoge”を数値に変換したときにnullになってしまうからでしょうか。
("hoge" == 0) -> 1
というわけでいつも通り===を使用すればOKです。
("hoge" === 0) ->
つまり、in_arrayでも===, !==になれば正しく有無を判定できるわけで
in_arrayの第三引数にtrueを渡せばOKです。
in_array("hoge", [0,1,2], true) -> in_array("", [0,1,2], true) -> in_array(0, ["foo","bar"], true) ->
ただし、これを使うと当然のことに以下はfalseになります。
in_array(0, ["0","1","2"], true) ->
というわけでこのような混乱を避けるために
PHPではfalseや空白と同じ値として0を使うのはアリだとしても
コード値などに0を使うのはできるだけ避けて
1,2,3…のように1から始めるようにしましょう。