原因是, 数字与字符串比较时, 先尝试将字符串转换为数字, 再比较, 一个不能转换为数字的字符串, 转换结果为0, 故, 与0比较总返回 true.
在PHP里当两个数字型字符串(只含数字的字符串)进行比较的时候是直接转换成数值进行比较的
如下示例:(注意$a和$b两个变量的最后一位不相等)
示例代码:
<?php
$a = '511203199106034578';
$b = '511203199106034579';
if ($a==$b) {
echo 'equal';
} else {
echo 'notEqual';
}
?>运行上面的程序却发现结果为equal(非我们认为的结果) 我们把$a与$b分别加一个字母a进去
<?php
$a = 'a511203199106034578';
$b = 'a511203199106034579';
if ($a==$b) {
echo 'equal';
} else {
echo 'notEqual';
}
?>这次输出的是notEqual(正确的结果)
说明:上面实例为equal是因为PHP把两个数字型字符串转换成数字型,而这两个数字刚好相等
<?php $a = 511203199106034578; $b = 511203199106034579; echo $a; // 输出 5.1120319910603E+17 即511203199106030000 echo $b; // 输出 5.1120319910603E+17 即511203199106030000 ?>
所以我们在示例中得到的结果是equal
避免出现这种非预期结果的情况是使用类型比较符===如下示例(如果 $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
";
}esle{
echo "1.not equal
";
}
if($str1 === $str2){
echo "2.equal
";
}esle{
echo "2.not equal
";
}
if(strcmp($st1, $str2)==0){
echo "3.equal
";
}esle{
echo "3.not equal
";
}
if($str1 == $str2){
echo "1.equal
";
}esle{
echo "1.not equal
";
}运行后的结果挺诡异的:
1.equal
2.not equal
3.not equal
查了一下原因,php在比较两个数字字符串的时候,首先会把这两个字符串当做数字,并且用科学计数法存储这两个字符串,科学计数法保留小数点后16位。换言之,在存储时,$str1=1.2345678901234567E+17;$str2=1.2345678901234567E+17。于是判断$str1==$str2。长度不同、在字符串中加非数字字符等等都会引起两个字符串的不等。所以,在能够确定的前提下推荐使用三等号判断,或者用strcmp或来进行强类型判断。
| 欢迎光临 一起源码网 (https://www.171739.xyz/) | Powered by Discuz! X3.3 |