PHPのin_arrayでtrueとfalseが正しく判定されない

PHP
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から始めるようにしましょう。
タイトルとURLをコピーしました