0 ( 演算子 は ==) を、数値ではない先頭の 文字列 (つまり、数値に変換できない文字) と比較すると、すべて true が返されます。
その理由は、数値と文字列を比較する場合、まず文字列を数値に変換してから比較します。文字列を数値に変換できない場合、変換結果は 0 になります。したがって、PHP では、0 と比較すると常に true が返されます。 2 つの数値文字列 (数値の文字列のみ) を直接数値に変換して比較する場合
以下の例: (2 つの変数 $a と $b の最後の桁が等しくないことに注意してください)
サンプルコード:
<?php $a = '511203199106034578'; $b = '511203199106034579'; if ($a==$b) { echo 'equal'; } else { echo 'notEqual'; } ?>
上記を実行すると、結果は等しいことが分かりました(思った結果ではありません) $a と $b にそれぞれ文字 a を追加しました
<?php $a = 'a511203199106034578'; $b = 'a511203199106034579'; if ($a==$b) { echo 'equal'; } else { echo 'notEqual'; } ?>
今回の出力は notEqual (正しい結果) です。
説明: PHP は 2 つの数値文字列を数値型に変換し、2 つの数値が正確に等しいため、上の例は等しいです
<?php $a = 511203199106034578; $b = 511203199106034579; echo $a; // 输出 5.1120319910603E+17 即511203199106030000 echo $b; // 输出 5.1120319910603E+17 即511203199106030000 ?>
したがって、例で得られた結果は等しいです
この予期しない結果を回避するには、型比較を使用します演算子 == =次の例 ($a が $b に等しく、型も同じ場合)<?php $a = '511203199106034578'; $b = '511203199106034579'; if ($a===$b) { echo 'equal'; } else { echo 'notEqual'; } ?>
<?php $str1 = "123456789012345678"; $str2 = "123456789012345679"; if($str1 == $str2){ echo "1.equal\n"; }esle{ echo "1.not equal\n"; } if($str1 === $str2){ echo "2.equal\n"; }esle{ echo "2.not equal\n"; } if(strcmp($st1, $str2)==0){ echo "3.equal\n"; }esle{ echo "3.not equal\n"; } if($str1 == $str2){ echo "1.equal\n"; }esle{ echo "1.not equal\n"; }
実行後の結果は非常に奇妙です:
1.equal
2.等しくない
3 .等しくない
PHPが2つの数値文字列を比較するとき、最初に2つの文字列を数値として扱い、2つの文字列を科学的表記法で保存します。ビット。つまり、格納時は $str1=1.2345678901234567E+17; $str2=1.2345678901234567E+17 となります。したがって、$str1==$str2 と判断されます。長さが異なる、文字列に数値以外の文字を追加するなどすると、2 つの文字列が等しくなくなります。したがって、
データ型が判定できる場合は3番目の等号判定を使用するか、強い型判定を行う場合はstrcmpまたはstrcasecmpを使用することをお勧めします。
以上がPHP の数値と文字列における一般的なトラップの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。