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-cli简介(不会Shell语言一样用Shell)
Jun 03 PHP
php中AES加密解密的例子小结
Feb 18 PHP
一个PHP针对数字的加密解密类
Mar 20 PHP
30个php操作redis常用方法代码例子
Jul 05 PHP
php图片处理函数获取类型及扩展名实例
Nov 19 PHP
PHP实现带重试功能的curl连接示例
Jul 28 PHP
示例详解Laravel的注册重构
Aug 14 PHP
PHP7匿名类用法分析
Sep 26 PHP
PHP实现登陆并抓取微信列表中最新一组微信消息的方法
Jul 10 PHP
php intval函数用法总结
Apr 14 PHP
Yii框架响应组件用法实例分析
Sep 04 PHP
tp5框架的增删改查操作示例
Oct 31 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+mysql开源XNA 聚合程序发布 下载
2007/07/13 PHP
php下删除一篇文章生成的多个静态页面
2010/08/08 PHP
SAE实时日志接口SDK用法示例
2016/10/09 PHP
PHP二维关联数组的遍历方式(实例讲解)
2017/10/18 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
2020/02/23 PHP
通过JAVASCRIPT读取ASP设定的COOKIE
2007/02/15 Javascript
解决表单中第一个非隐藏的元素获得焦点的一个方案
2009/10/26 Javascript
javascript中callee与caller的用法和应用场景
2010/12/08 Javascript
JQuery扩展插件Validate 3通过参数设置错误信息
2011/09/05 Javascript
jQuery点击tr实现checkbox选中的方法
2013/03/19 Javascript
Jquery中ajax方法data参数的用法小结
2014/02/12 Javascript
随鼠标移动的时钟非常漂亮遗憾的是只支持IE
2014/08/12 Javascript
JQuery实现简单的图片滑动切换特效
2015/11/22 Javascript
JavaScript学习笔记整理_关于表达式和语句
2016/09/19 Javascript
jquery.tableSort.js表格排序插件使用方法详解
2020/08/12 Javascript
基于vue的fullpage.js单页滚动插件
2017/03/20 Javascript
详谈js中标准for循环与foreach(for in)的区别
2017/11/02 Javascript
jQuery+ajax实现动态添加表格tr td功能示例
2018/04/23 jQuery
JavaScript折半查找(二分查找)算法原理与实现方法示例
2018/08/06 Javascript
layui表格 列自动适应大小失效的解决方法
2019/09/06 Javascript
JavaScript console的使用方法实例分析
2020/04/28 Javascript
详解ES6 扩展运算符的使用与注意事项
2020/11/12 Javascript
数据清洗--DataFrame中的空值处理方法
2018/07/03 Python
对numpy中的where方法嵌套使用详解
2018/10/31 Python
Ubuntu下升级 python3.7.1流程备忘(推荐)
2018/12/10 Python
Django基于Models定制Admin后台实现过程解析
2020/11/11 Python
澳大利亚墨水站Ink Station:墨水和碳粉打印机墨盒
2019/03/24 全球购物
小学教育毕业生自荐信
2013/11/18 职场文书
校园歌手大赛策划书
2014/01/17 职场文书
小学开学寄语
2014/01/19 职场文书
收银员的岗位职责范本
2014/02/04 职场文书
政府班子四风问题整改措施
2014/10/04 职场文书
合伙开公司协议书范本
2014/10/28 职场文书
古诗之感恩老师
2019/10/24 职场文书
mysql分表之后如何平滑上线详解
2021/11/01 MySQL
MySQL添加索引特点及优化问题
2022/07/23 MySQL