in_arrayという関数がPHPにありまして、便利です。配列の中に該当の文字列があるかどうか探してきてくれます。
この関数に関連する記事をぐぐってみると以下のような感じです。
かなり多くの人が「第三引数にtrueを絶対につけろよ!!!」って言っています。
彼らの主張は正しいのですが、ぼくのように馬鹿正直に「in_array使うから、trueもつけちゃおう!!」とかって何も考えずに書いてしまうと死にます。
ちゃんと意味を理解してからtrueを書きましょう!!!!
- trueをつけると型までみてくれる。
- 僕の敗因:方が違うものを比べていた
- どのような場面にtrueが必要なのか
trueをつけると型までみてくれる
なぜ第三引数にtrueが必要なのか。
それは型があっているのかどうかまでみてくれるからですね。
つけないと型がちがっても柔軟に対応してくれるのです
例えば
4 == "4.0"
これ左がintで右がvarcharのように見えますが返し値はtrueになります。
ちなみにPHPでは == ではなく === で型までみるようになります。
なので
4 === "4.0"
これは型までみたことによりfalseが返ってきます。おもしろいですね〜
僕の敗因:型が違うものを比べていた
僕はDBからもってきたデータconfigの中に用意してある定数と比較するためにin_arrayを使いました。
そこでなんの疑問も持たずtrueをつけると、なぜかすべてがfalseで返ってきたので?????と。
調査してみると、、
DBで数値しか入っていないカラムがvarcharやんけ。。。なんでや。。。
そもそも設計からアレなんですが、これによってin_arrayさんは intとvarcharを常に比較しているという事態になってしまっていました。ショック!!
どのようにtrueを扱うのか
基本的にtrueなしでやると型を考えずに比較してくれるのは便利です。
ただ、その場合に怖いのは0です。
例えば
0 == "a"
この演算子はtrueになります。まあ意味不明ですね。
これは”a”をint型で表すと0になるので、型を考えないこの書き方だとtrueになるそうです。そんな無茶な。
よってtrueをつかうときは
- 0を比較する場面が発生しそうな場合は必ず使用
- 比較対象の型がバラバラになりそうである場面では型をあわせる設定を行うか,
trueは使わない - とにかく比較対象の型と0の有無を意識する
これらを意識づけしておけばいいかなあと思いました。以上です。