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

2015-01-24信息快讯网

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

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字符串的比较函数strcmp()与strcasecmp()的使用详解
Mysql中分页查询的两个解决方法比较
PHP字符串的编码问题的详细介绍
用PHP提取中英文词语以及数字的首字母的方法介绍
str_replace只替换一次字符串的方法
PHP 数组和字符串互相转换实现方法
PHP字符过滤函数去除字符串最后一个逗号(rtrim)
比较简单的百度网盘文件直链PHP代码
PHP人民币金额数字转中文大写的函数代码
php中导出数据到excel时数字变为科学计数的解决方法
PHP中函数rand和mt_rand的区别比较
PHP以及MYSQL日期比较方法
PHP中数字检测is_numeric与ctype_digit的区别介绍
php数字游戏 计算24算法
PHP中其实也可以用方法链
PHP及Zend Engine的线程安全模型分析
php中常用字符串处理代码片段整理
php smarty截取中文字符乱码问题?gb2312/utf-8
php环境配置之CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI比较?
比较简单实用的PHP无限分类源码分享(思路不错)
php数字转汉字代码(算法)
php若干单维数组遍历方法的比较
php中判断字符串是否全是中文或含有中文的实现代码
php将时间差转换为字符串提示
php中将图片gif,jpg或mysql longblob或blob字段值转换成16进制字符串
php中计算中文字符串长度、截取中文字符串的函数代码
php中比较简单的导入phpmyadmin生成的sql文件的方法
比较时间段一与时间段二是否有交集的php函数
php下封装较好的数字分页方法
《PHP编程最快明白》第二讲 数字、浮点、布尔型、字符串和数组
©2014-2024 dbsqp.com