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

シェアする

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から始めるようにしましょう。