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
不用数据库的多用户文件自由上传投票系统(2)
Oct 09 PHP
PHP详细彻底学习Smarty
Mar 27 PHP
PHP反射使用实例和PHP反射API的中文说明
Jul 02 PHP
ThinkPHP惯例配置文件详解
Jul 14 PHP
smarty模板引擎从配置文件中获取数据的方法
Jan 22 PHP
php实现中文转数字
Feb 18 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
Sep 16 PHP
thinkPHP3.2.3实现阿里大于短信验证的方法
Jun 06 PHP
php pdo连接数据库操作示例
Nov 18 PHP
PHP架构及原理知识点详解
Dec 22 PHP
YII2框架中actions的作用与使用方法示例
Mar 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
PHP写的求多项式导数的函数代码
2012/07/04 PHP
PHP的魔术常量__METHOD__简介
2014/07/08 PHP
php封装的page分页类完整实例
2016/10/18 PHP
[原创]PHP正则删除html代码中a标签并保留标签内容的方法
2017/05/23 PHP
javascript中获取选中对象的类型
2007/04/02 Javascript
javascript深入理解js闭包
2010/07/03 Javascript
js数组Array sort方法使用深入分析
2013/02/21 Javascript
js图片自动轮播代码分享(js图片轮播)
2014/05/06 Javascript
Javascript解析URL方法详解
2014/12/05 Javascript
jQuery实现自定义下拉列表
2015/01/05 Javascript
开启Javascript中apply、call、bind的用法之旅模式
2015/10/28 Javascript
JavaScript获取对象在页面中位置坐标的方法
2016/02/03 Javascript
在javascript中使用com组件的简单实现方法
2016/08/17 Javascript
Node.js中使用jQuery的做法
2016/08/17 Javascript
JS实用的带停顿的逐行文本循环滚动效果实例
2016/11/23 Javascript
js实现时间轴自动排列效果
2017/03/09 Javascript
BootStrap给table表格的每一行添加一个按钮事件
2017/09/07 Javascript
tween.js缓动补间动画算法示例
2018/02/13 Javascript
详解在React.js中使用PureComponent的重要性和使用方式
2018/07/10 Javascript
[03:05]《我与DAC》之xiao8:DAC与BG
2018/03/27 DOTA
PyQt 实现使窗口中的元素跟随窗口大小的变化而变化
2019/06/18 Python
python opencv如何实现图片绘制
2020/01/19 Python
Python通过正则库爬取淘宝商品信息代码实例
2020/03/02 Python
pytorch 多分类问题,计算百分比操作
2020/07/09 Python
Python系统公网私网流量监控实现流程
2020/11/23 Python
CSS3 中的@keyframes介绍
2014/09/02 HTML / CSS
CSS3实现王者匹配时的粒子动画效果
2019/04/12 HTML / CSS
世界上最大的艺术社区:SAA
2020/12/30 全球购物
高中生期末评语大全
2014/01/28 职场文书
大学新学期计划书
2014/04/28 职场文书
医疗器械售后服务承诺书
2014/05/21 职场文书
项目经理任命书内容
2014/06/06 职场文书
文明倡议书
2015/01/19 职场文书
2015年人力资源工作总结
2015/04/08 职场文书
oracle索引总结
2021/09/25 Oracle
HTML页面点击按钮关闭页面的多种方式
2022/12/24 HTML / CSS