プログラミングをしていると、思わぬ挙動に出会うことがあります。

その一つが、PHPにおける文字列と数値の比較です。
特に '01''1' の扱いは、多くの初学者や実務者を混乱させるポイントです。

本記事では、その仕組みと注意点を解説します。

PHPにおける比較の基本

PHPでは、比較演算子(=====)によって動作が異なります。

  • == (等価演算子) … 型の変換を行った上で比較する
  • === (厳密比較演算子) … 型も含めて完全に一致しているかを比較する

このため、'01''1' を比較したときに結果が変わることがあります。

実際の動作例

実際の動作例をみてみましょう。

比較演算子の挙動

var_dump('01' == '1'); // bool(true)
var_dump('01' === '1'); // bool(false)

結果の理由

  • == では、PHPが文字列を数値に変換して比較します。'01''1' も整数値に変換すると **1** になるため、true になります。
  • ==== では、型変換を行わずにそのまま比較するので、 '01''1' は **異なる文字列** と判断され、false になります。

in_arrayでの挙動

in_array()関数での挙動もチェックしてみましょう。

var_dump(in_array('1', $values)); // bool(true)
var_dump(in_array('1', $values, true)); // bool(false)

結果の理由

  • in_array('1', $values) では、型変換が行われるため '01''1' が同じと判定され、true になります。
  • in_array('1', $values, true) では、厳密な比較が行われるため '01''1' は異なる文字列として扱われ、false になります。

注意すべきケース

配列のキー比較

PHPでは配列のキーも自動的に数値に変換されることがあります。

$array = [
'01' => 'A',
'1' => 'B'
];

print_r($array);

出力:
Array
(
[1] => B
)

この場合、 '01''1' は同じキーと見なされ、後から定義した '1' が上書きされてしまいます。

まとめ

  • '01''1'等価演算子 == では同じと判定される。
  • 厳密比較演算子 === を使えば、文字列としては異なるものと判定できる。
  • in_array でもデフォルトでは同一視されるが、厳密モード(第3引数を true)にすれば区別可能。
  • 配列のキーとして使うと '01''1' と同一視され、上書きされる危険がある。

実務でのおすすめ対策

  1. 比較は常に === を使う … 型の違いによるバグを避けられる
  2. 配列キーにはゼロ埋めの文字列を使わない … 意図しない上書きを防ぐ
  3. 明示的な型変換を心がけるintval()(string) で型を統一

最後に

'01''1' は同じなの?」という疑問は、PHPにおける暗黙の型変換が原因です。
挙動を理解しておくことで、思わぬバグを回避できるでしょう。

実務では === を基本に、型の扱いを意識することが大切です。