• ベストアンサー

0dで始まる文字列の比較がうまくいきません。

文字列"0d1"と"0d2"を比較すると, 一致しないと思われるのですが, これが一致することになってしまいます。 if("0d1"=="0d2"){ print('一致しました。'); } else { print('一致しませんでした。'); } これを実行すると, "一致しました"と出力されます。 比較を===で行うと, "一致しませんでした"となります。 PHPはversion4.3.5をApacheで使用しています。 OSはWindows 2000です。 この理由がわかる方, どうか回答をよろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • yatokesa
  • ベストアンサー率40% (201/496)
回答No.1

まず、== での比較は "0d1", "0d2"が文字列ではなく数値として見なされているからです。 0で始まる数値は8進数ですが、0d1, 0d2ともに8進数に変換できずに 0になっているため「等しい」と判断されています。 「$a === $bは、 $a が $b に等しく同じ型である場合に TRUE」とマニュアルに書かれていますが、なぜ等しくないと判断されるのか資料を見つけることができませんでした。 if("0d1"=="0d2"){ を if(strval("0d1") == strval("0d2")){ と強制的に文字列に変換しても、変換前に数値と判断されてしまうようで「等しい」という結果になりました。 === は""引用符を文字列と判断させる仕掛けがあって、文字列として比較するのではないかと憶測できます。 追試として、 if(091 === 092){ ...一致 if("091" === "092"){ ...不一致 でした。 以上参考になれば幸いです。

funi2
質問者

お礼

回答ありがとうございます! 完全に納得できました。 変数の型がゆるい言語の代償として, 値の内容に注意して スクリプトを組んでいきたいと思います。 本当にありがとうございました!