PHPでは’01’と’1’は同じ扱い!?詳しく解説!
管理者

記事内に商品プロモーションを含む場合があります
プログラミングをしていると、思わぬ挙動に出会うことがあります。
その一つが、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'と同一視され、上書きされる危険がある。
実務でのおすすめ対策
- 比較は常に
===を使う … 型の違いによるバグを避けられる - 配列キーにはゼロ埋めの文字列を使わない … 意図しない上書きを防ぐ
- 明示的な型変換を心がける …
intval()や(string)で型を統一
最後に
「'01' と '1' は同じなの?」という疑問は、PHPにおける暗黙の型変換が原因です。
挙動を理解しておくことで、思わぬバグを回避できるでしょう。
実務では === を基本に、型の扱いを意識することが大切です。
























