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

  •   
  • 4845
  • PHP
  • 0
  • super_dodo
  • 2013/09/23

数字与字符串之间的比较

//数值0与任意非数字(或者说,不可转化为数字的字符)前导的字符串比较(操作符为==),均返回 true.
//原因是:数字与字符串比较时,先尝试将字符串转换为数字,再比较,一个不能转换为数字的字符串,转换结果为0,故与0比较总返回true.
//因为0和字符串比较,皆返回true 严格比较需要使用===(且最好加单引号)
// 0 == 'sdssdsa'  		返回true(注意)
// '0' == 'sdssdsa' 	返回false
// 0 === 'sdssdsa'		返回false
// '0' === 'sdssdsa'	返回false(严谨一些)
// 1 == '1asdsad'		返回true(注意)
// '1' == '1asdsad'		返回false
// 1 == 'a122asd'		返回false

if('0' === 'sdssdsa'){
	echo '相同/匹配!!!';
}else{
	echo '不同/不匹配???';
}

// 特殊,两个数值类型过长的比较。php会自动转换类型,会影响比较结果。
//在PHP里当两个数字型字符串(只含数字的字符串)进行比较的时候是直接转换成数值进行比较的 
$a = '511203199106034578'; 
$b = '511203199106034579'; 
if($a==$b){ 
	echo '相同/匹配!!!<hr>'; 
}else{ 
	echo '不同/不匹配???<hr>'; 
}
//运行上面的程序却发现结果为"相同/匹配!!!"(非我们认为的结果)

//上面示例为"相同/匹配!!!"是因为PHP把两个数字型字符串转换成数字型,而这两个数字刚好相等如下 
$a = 511203199106034578; 
$b = 511203199106034579; 
echo $a."<hr>"; // 输出 5.1120319910603E+17 即511203199106030000 
echo $b."<hr>"; // 输出 5.1120319910603E+17 即511203199106030000 
//所以我们在示例1中得到的结果是"相同/匹配!!!"


//我们把$a与$b分别加一个字母a进去 
$a = 'a511203199106034578'; 
$b = 'a511203199106034579'; 
if($a==$b){ 
	echo '相同/匹配!!!<hr>'; 
}else{ 
	echo '不同/不匹配???<hr>'; 
}
//这次输出的是"不同/不匹配???"(正确的结果)


//避免出现这种非预期结果的情况是使用类型比较符===如下示例(如果$a等于$b,并且它们的类型也相同)
$a = '511203199106034578'; 
$b = '511203199106034579'; 
if($a===$b){ 
	echo '相同/匹配!!!<hr>'; 
}else{ 
	echo '不同/不匹配???<hr>'; 
}
//这样我们就可以得到预期中的"不同/不匹配???"了
//(数值需要带引号,不带引号===返回值亦为"相同/匹配!!!")


//延伸示例
$str = 'host';
$arr = array('0'=>'AAAA','host'=>'BBBB','1'=>'CCCC');
foreach($arr as $k=>$v){
	if($k == $str){				//$k为数值型 
		echo $str.'=='.$k.'======>'.$v;
	}
}
//得到的结果为:host==0======>AAAA  host==host======>BBBB

So, do you want to take a leap of faith? Or become an old man, filled with regret, waiting to die alone? 那么,你愿意放手一搏,还是要等到年华老去,心中充满遗憾,孤独地迈向黄泉路?—《盗梦空间》