PHP中in_array异常字符串匹配问题的原因与解决
问题
我拥有一个小写十六进制字符串数组,使用in_array函数时出现异常:不存在的字符串被判定为存在。代码示例如下:
$x = '000e286592'; $y = '0e06452425'; $testarray = []; $testarray[] = $x; if (in_array($y, $testarray)) { echo "Array element ".$y." already exists in text array "; } print_r($testarray);exit();
上述代码中in_array返回true,但0e06452425并不在数组中,请问该现象原因及解决方法?
原因分析
这是PHP松散类型比较导致的问题。in_array默认使用松散比较(==),当字符串符合科学计数法格式时,PHP会自动将其转换为浮点数:
'000e286592'被解析为0(000e286592等价于0 * 10^286592,结果为0)'0e06452425'同样被解析为0(0 * 10^6452425,结果也是0)
松散比较下两者数值相等,因此in_array返回true。
解决方法
给in_array添加第三个参数true,启用严格类型比较(===),同时对比值和类型,避免字符串被自动转换:
$x = '000e286592'; $y = '0e06452425'; $testarray = []; $testarray[] = $x; if (in_array($y, $testarray, true)) { echo "Array element ".$y." already exists in text array "; } else { echo "Array element ".$y." does not exist in text array "; } print_r($testarray);exit();
此时in_array会严格匹配字符串内容和类型,不会再出现误判。
内容的提问来源于stack exchange,提问作者Peter Blaskowski
相关产品推荐
相关产品推荐

