PHP容易被忽略而出错陷阱 数字与字符串比较


Posted in PHP onNovember 10, 2011

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

原因是, 数字与字符串比较时, 先尝试将字符串转换为数字, 再比较, 一个不能转换为数字的字符串, 转换结果为0, 故, 与0比较总返回 true.

更加详细的比较规则, 多种类型的比较规则, 在 PHP手册/语言参考/运算符/比较运算符 可以找到.

在PHP里当两个数字型字符串(只含数字的字符串)进行比较的时候是直接转换成数值进行比较的
如下示例:(注意$a和$b两个变量的最后一位不相等)

//示例1 
<?php 
$a = '511203199106034578'; 
$b = '511203199106034579'; 
if ($a==$b) { 
echo 'equal'; 
} else { 
echo 'notEqual'; 
} 
?>

运行上面的程序却发现结果为equal(非我们认为的结果)

我们把$a与$b分别加一个字母a进去

//示例2 
<?php 
$a = 'a511203199106034578'; 
$b = 'a511203199106034579'; 
if ($a==$b) { 
echo 'equal'; 
} else { 
echo 'notEqual'; 
} 
?>

这次输出的是notEqual(正确的结果)

示例1为equal是因为PHP把两个数字型字符串转换成数字型,而这两个数字刚好相等如下示例

<?php 
$a = 511203199106034578; 
$b = 511203199106034579; 
echo $a; // 输出 5.1120319910603E+17 即511203199106030000 
echo $b; // 输出 5.1120319910603E+17 即511203199106030000 
?>

所以我们在示例1中得到的结果是equal

避免出现这种非预期结果的情况是使用类型比较符===如下示例(如果 $a 等于 $b,并且它们的类型也相同)

//示例4 
<?php 
$a = '511203199106034578'; 
$b = '511203199106034579'; 
if ($a===$b) { 
echo 'equal'; 
} else { 
echo 'notEqual'; 
} 
?>

这样我们就可以得到预期中的notEqual了
PHP 相关文章推荐
php抓即时股票信息
Oct 09 PHP
php xml实例 留言本
Mar 20 PHP
mysql_fetch_row,mysql_fetch_array,mysql_fetch_assoc的区别
Apr 24 PHP
一个PHP的String类代码
Apr 20 PHP
PHP 循环列出目录内容的函数代码
May 26 PHP
PHP 作用域解析运算符(::)
Jul 27 PHP
PHP中获取变量的变量名的一段代码的bug分析
Jul 07 PHP
php程序内部post数据的方法
Mar 31 PHP
PHP常用的三种设计模式
Feb 17 PHP
PHP实现限制IP访问及提交次数的方法详解
Jul 17 PHP
PHP实现的mongoDB数据库操作类完整实例
Apr 10 PHP
PHP多个图片压缩成ZIP的方法
Aug 18 PHP
PHP及Zend Engine的线程安全模型分析
Nov 10 #PHP
PHP 多维数组的排序问题 根据二维数组中某个项排序
Nov 09 #PHP
php fsockopen中多线程问题的解决办法[翻译]
Nov 09 #PHP
PHP句法规则详解 入门学习
Nov 09 #PHP
php空间不支持socket但支持curl时recaptcha的用法
Nov 07 #PHP
PHP动态分页函数,PHP开发分页必备啦
Nov 07 #PHP
php获取远程图片的两种 CURL方式和sockets方式获取远程图片
Nov 07 #PHP
You might like
常用的php对象类型判断
2008/08/27 PHP
学习php笔记 字符串处理
2010/10/19 PHP
discuz目录文件资料汇总
2014/12/30 PHP
php array_chunk()函数用法与注意事项
2019/07/12 PHP
php使用pthreads v3多线程实现抓取新浪新闻信息操作示例
2020/02/21 PHP
根据分辩率调用不同的CSS.
2007/01/08 Javascript
JavaScript游戏之优化篇
2010/11/08 Javascript
javascript dom追加内容实现示例
2013/09/21 Javascript
Bootstrap实现默认导航栏效果
2020/09/21 Javascript
鼠标悬停小图标显示大图标
2016/01/22 Javascript
jQuery form插件之formDdata参数校验表单及验证后提交
2016/01/23 Javascript
使用jQuery的easydrag插件实现可拖动的DIV弹出框
2016/02/19 Javascript
微信扫码支付零云插件版实例详解
2017/04/26 Javascript
Vue实现typeahead组件功能(非常靠谱)
2017/08/26 Javascript
详解vue axios二次封装
2018/07/22 Javascript
vue项目持久化存储数据的实现代码
2018/10/01 Javascript
Layui数据表格判断编辑输入的值,是否为我需要的类型详解
2019/10/26 Javascript
解决vue 子组件修改父组件传来的props值报错问题
2019/11/09 Javascript
jquery实现烟花效果(面向对象)
2020/03/10 jQuery
详解JavaScript 异步编程
2020/07/13 Javascript
[05:48]DOTA2英雄梦之声vol21 屠夫
2014/06/20 DOTA
Python中的jquery PyQuery库使用小结
2014/05/13 Python
Python Django Vue 项目创建过程详解
2019/07/29 Python
从pandas一个单元格的字符串中提取字符串方式
2019/12/17 Python
Python爬虫实现模拟点击动态页面
2020/03/05 Python
CSS3效果:自定义“W”形运行轨迹实例
2017/03/29 HTML / CSS
广州盈通面试题
2015/12/05 面试题
RIP版本1跟版本2的区别
2013/12/30 面试题
旅游与酒店管理的自我评价分享
2013/11/03 职场文书
董事长秘书岗位职责
2013/11/29 职场文书
综合办公室个人的自我评价
2013/12/22 职场文书
写给女朋友的道歉信
2014/01/12 职场文书
入学生会自荐书范文
2014/02/05 职场文书
繁星春水读书笔记
2015/06/30 职场文书
2016中秋节问候语
2015/11/11 职场文书
「约定的梦幻岛」作画发布诺曼生日新绘
2022/03/21 日漫