7
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【PHP】in_arrayの第三引数にtrueをつけていたら死んだ話

Posted at

in_arrayという関数がPHPにありまして、便利です。配列の中に該当の文字列があるかどうか探してきてくれます。

この関数に関連する記事をぐぐってみると以下のような感じです。

in_arrayを使うときは黙って第三引数を付けること

【PHP】in_array()関数では第3引数(true)を設定する

PHPのin_arrayは罠が多いので注意喚起が必要

かなり多くの人が「第三引数にtrueを絶対につけろよ!!!」って言っています。

彼らの主張は正しいのですが、ぼくのように馬鹿正直に「in_array使うから、trueもつけちゃおう!!」とかって何も考えずに書いてしまうと死にます。

ちゃんと意味を理解してからtrueを書きましょう!!!!

  1. trueをつけると型までみてくれる。
  2. 僕の敗因:方が違うものを比べていた
  3. どのような場面に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の有無を意識する

これらを意識づけしておけばいいかなあと思いました。以上です。

7
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?