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 相关文章推荐
VFP与其他应用程序的集成
Oct 09 PHP
用PHP实现小型站点广告管理
Oct 09 PHP
菜鸟学PHP之Smarty入门
Jan 04 PHP
php PDO中文乱码解决办法
Jul 20 PHP
PHP MemCached 高级缓存应用代码
Aug 05 PHP
深入PHP autoload机制的详解
Jun 09 PHP
PHP利用APC模块实现文件上传进度条的方法
Jan 26 PHP
PHP微信开发之模板消息回复
Jun 24 PHP
php rmdir使用递归函数删除非空目录实例详解
Oct 20 PHP
thinkphp分页集成实例
Jul 24 PHP
ThinkPHP框架中使用Memcached缓存数据的方法
Mar 31 PHP
Yii框架学习笔记之应用组件操作示例
Nov 13 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
Amazon Prime Video平台《无限住人 -IMMORTAL-》2020年开始TV放送!
2020/03/06 日漫
PHP 多维数组的排序问题 根据二维数组中某个项排序
2011/11/09 PHP
基于PHP静态类的原罪详解
2013/05/06 PHP
php获取指定日期之间的各个周和月的起止时间
2014/11/24 PHP
php微信公众号开发(2)百度BAE搭建和数据库使用
2016/12/15 PHP
BOOM vs RR BO5 第二场 2.14
2021/03/10 DOTA
提高 DHTML 页面性能
2006/12/25 Javascript
控制input输入框中提示信息的显示和隐藏的方法
2014/02/12 Javascript
Javascript获取表单名称(name)的方法
2015/04/02 Javascript
js获取滚动距离的方法
2015/05/30 Javascript
JQuery包裹DOM节点的方法
2015/06/11 Javascript
JavaScript修改作用域外变量的方法
2016/03/25 Javascript
JS点击某个图标或按钮弹出文件选择框的实现代码
2016/09/27 Javascript
深入理解Javascript中的作用域链和闭包
2017/04/25 Javascript
Vue.Draggable实现拖拽效果
2020/07/29 Javascript
js自定义input文件上传样式
2018/10/26 Javascript
nodejs的安装使用与npm的介绍
2019/09/11 NodeJs
[04:42]2015国际邀请赛CDEC战队晋级之路
2015/08/13 DOTA
Python采用raw_input读取输入值的方法
2014/08/18 Python
使用graphics.py实现2048小游戏
2015/03/10 Python
Python中的多重装饰器
2015/04/11 Python
Python实现字符串反转的常用方法分析【4种方法】
2017/09/30 Python
Python实现PS滤镜中马赛克效果示例
2018/01/20 Python
Python中的Django基本命令实例详解
2018/07/15 Python
详解python安装matplotlib库三种失败情况
2020/07/28 Python
Pycharm2020.1安装无法启动问题即设置中文插件的方法
2020/08/07 Python
如何基于Python实现word文档重新排版
2020/09/29 Python
施华洛世奇德国官网:SWAROVSKI德国
2017/02/01 全球购物
加拿大折扣、优惠券和交易网站:WagJag
2018/02/07 全球购物
敬老文明号事迹材料
2014/01/16 职场文书
材料员岗位职责
2014/03/13 职场文书
经营理念口号
2014/06/21 职场文书
群众路线剖析材料(四风)
2014/11/05 职场文书
党员个人党性分析材料
2014/12/18 职场文书
新娘婚礼致辞
2015/07/27 职场文书
运动会跳远广播稿
2015/08/19 职场文书