详解php数字和字符串比较容易出现的陷阱

企鹅博客
19267
文章
0
评论
2019年7月12日20:19:47 评论 976 views 1461字阅读4分52秒

0 与任意非数字(或者说,不可转化为数字的字符)前导的字符串比较(操作符为==), 均返回 true.

原因是, 数字与字符串比较时, 先尝试将字符串转换为数字, 再比较, 一个不能转换为数字的字符串, 转换结果为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\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.not equal

3.not equal

查了一下原因,php在比较两个数字字符串的时候,首先会把这两个字符串当做数字,并且用科学计数法存储这两个字符串,科学计数法保留小数点后16位。换言之,在存储时,$str1=1.2345678901234567E+17;$str2=1.2345678901234567E+17。于是判断$str1==$str2。长度不同、在字符串中加非数字字符等等都会引起两个字符串的不等。所以,在能够确定数据类型的前提下推荐使用三等号判断,或者用strcmp或strcasecmp来进行强类型判断。

以上就是详解php数字和字符串比较容易出现的陷阱的详细内容,更多请关注php教程网其它相关文章!

继续阅读
  • 版权声明: 发表于 2019年7月12日20:19:47
  • 转载注明:https://www.qieseo.com/255975.html
PHP编辑器PhpStrom运行缓慢 php教程

PHP编辑器PhpStrom运行缓慢

最近在使用phpstorm开发项目的时候,在加载文件运行时,不管有多大,如果项目文件数据比较多的话,都能够让phpstorm卡到死机。其中调整过内存设置,关闭过动态提示,使用过phpstorm的安全模...
php隐藏文件实际下载地址的方法 php教程

php隐藏文件实际下载地址的方法

这篇文章主要介绍了php隐藏实际地址的文件下载方法,涉及php中header与file_get_contents方法的相关使用技巧,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了php隐藏实际...
PHP四舍五入、取整、round函数使用 php教程

PHP四舍五入、取整、round函数使用

这篇文章主要介绍了PHP四舍五入、取整、round函数使用示例,需要的朋友可以参考下 小数例子: PHP保留两位小数并且四舍五入 复制代码 代码如下: $n=0.1265489; echo sprin...
TP5读取txt文件的代码示例 php教程

TP5读取txt文件的代码示例

本篇文章给大家带来的内容是关于TP5读取txt文件的代码示例,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 1、读取文件将txt文件放入 public 文件夹中。(这是我TXT里的数...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: