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 相关文章推荐
攻克CakePHP系列三 表单数据增删改
Oct 22 PHP
Drupal7连接多个数据库及常见问题解决
Mar 02 PHP
PHP程序漏洞产生的原因分析与防范方法说明
Mar 06 PHP
ThinkPHP CURD方法之data方法详解
Jun 18 PHP
PHP使用适合阅读的格式显示文件大小的方法
Mar 05 PHP
php分割合并两个字符串的函数实例
Jun 19 PHP
如何在旧的PHP系统中使用PHP 5.3之后的库
Dec 02 PHP
PHP利用imagick生成组合缩略图
Feb 19 PHP
基于PHP实现通过照片获取ip地址
Apr 26 PHP
PHP判断文件是否被引入的方法get_included_files用法示例
Nov 29 PHP
PHP生成指定范围内的N个不重复的随机数
Mar 18 PHP
浅谈PHP7中的一些小技巧
May 29 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 UTF8 文件的签名问题
2009/10/30 PHP
Zend Framework教程之Zend_Layout布局助手详解
2016/03/04 PHP
Yii数据读取与跳转参数传递用法实例分析
2016/07/12 PHP
PHP实现的redis主从数据库状态检测功能示例
2017/07/20 PHP
PHP设计模式之策略模式原理与用法实例分析
2019/04/04 PHP
JS实多级联动下拉菜单类,简单实现省市区联动菜单!
2007/05/03 Javascript
JavaScript 继承详解(四)
2009/07/13 Javascript
JavaScript中判断函数是new还是()调用的区别说明
2011/04/07 Javascript
解析Jquery取得iframe中元素的几种方法
2013/07/04 Javascript
浅谈JavaScript之事件绑定
2013/07/08 Javascript
JavaScript模拟实现继承的方法
2015/03/30 Javascript
JavaScript中数组继承的简单示例
2015/07/29 Javascript
javascript制作照片墙及制作过程中出现的问题
2016/04/04 Javascript
怎么限制input的text里输入的值只能是数字(正则、js)
2016/05/16 Javascript
js 实现数值的千分位及保存小数方法(推荐)
2016/08/01 Javascript
JavaScript 中有关数组对象的方法(详解)
2016/08/15 Javascript
详解AngularJS如何实现跨域请求
2016/08/22 Javascript
浅析jsopn跨域请求原理及cors(跨域资源共享)的完美解决方法
2017/02/06 Javascript
vue引入swiper插件的使用实例
2017/07/19 Javascript
javaScript中&quot;==&quot;和&quot;===&quot;的区别详解
2018/03/16 Javascript
Vue数据双向绑定的深入探究
2018/11/27 Javascript
详解nodejs http请求相关总结
2019/03/31 NodeJs
jQuery 筛选器简单操作示例
2019/10/02 jQuery
js实现盒子移动动画效果
2020/08/09 Javascript
python实现kNN算法
2017/12/20 Python
Python爬取十篇新闻统计TF-IDF
2018/01/03 Python
python 利用pandas将arff文件转csv文件的方法
2019/02/12 Python
python挖矿算力测试程序详解
2019/07/03 Python
Django 使用easy_thumbnails压缩上传的图片方法
2019/07/26 Python
wxPython修改文本框颜色过程解析
2020/02/14 Python
python 使用递归回溯完美解决八皇后的问题
2020/02/26 Python
H&M美国官网:欧洲最大的服饰零售商
2016/09/07 全球购物
会议主持词
2014/03/17 职场文书
伊索寓言教学反思
2014/05/01 职场文书
销售经理工作失职检讨书
2014/10/24 职场文书
浅析Python中的套接字编程
2021/06/22 Python