是,in_array默认使用松散比较,字符串"0"与数字0被视为相等;需传入第三个参数true启用严格模式(===)才能区分类型。

in_array 会把字符串 "0" 和数字 0 当成相等?
默认情况下 in_array 使用松散比较(==),所以 in_array("0", [0, 1, 2]) 返回 true,哪怕你传的是字符串。这在表单校验、权限检查等场景容易误判。
解决办法是显式开启严格模式:
in_array("0", [0, 1, 2], true); // false
in_array(0, [0, 1, 2], true); // true
- 第三个参数设为
true启用全等比较(===) - 只要数组里有任意一个元素与搜索值类型和值都完全一致,就返回
true - 不加这个参数时,
"0"、0、false、空数组都可能被意外匹配
in_array 查不到浮点数?精度问题怎么破
浮点数在 PHP 中存储有精度限制,直接用 in_array(0.1 + 0.2, [0.3]) 很可能返回 false,因为 0.1 + 0.2 实际是 0.30000000000000004。
别硬刚浮点比较,改用 abs($a - $b) 思路:
$haystack = [0.3, 0.6, 0.9];
$needle = 0.1 + 0.2;
$found = false;
foreach ($haystack as $val) {
if (abs($val - $needle)
-
in_array本身不支持自定义比较逻辑,遇到浮点必须手动遍历 - 误差阈值选
1e-10足够覆盖大多数计算误差,太小反而不稳定 - 如果数据源可控,优先转成整数(比如金额存分为单位)或字符串再查
in_array 性能差?大数据量怎么办
in_array 是 O(n) 线性扫描,数组每多一个元素就多一次比较。当数组超过几千项,尤其在循环里反复调用,CPU 时间会明显上升。
高频查找请预处理成键值对:
$roles = ["admin", "editor", "viewer"];
$role_map = array_flip($roles); // ["admin"=>0, "editor"=>1, "viewer"=>2]
<p>// 查找变成 O(1) 哈希查找<br>
if (isset($role_map["editor"])) { /<em> 存在 </em>/ }</p>
-
array_flip把值变键后,isset()或array_key_exists()查找快得多 - 注意:原数组值必须是合法键名(不能是数组、对象、null)
- 如果原始数组含重复值,
array_flip会丢弃后面的重复项
in_array 对 null、空数组、对象的行为
松散模式下 in_array(null, [0, "", false, []]) 返回 true,因为 null == 0、null == "" 都成立;严格模式下只认 null === null。
对象永远无法被 in_array 找到(除非数组里存的就是同一个对象引用):
$a = new stdClass(); $b = new stdClass(); var_dump(in_array($a, [$a])); // true var_dump(in_array($b, [$a])); // false —— 即使属性相同也不行
- 检查对象存在性,应该用
===比较引用,或用serialize()后查(仅限简单对象) - 空数组
[]在松散模式下等价于false和"",务必用严格模式区分 - 如果不确定输入类型,先
is_scalar()判断再决定是否走in_array
严格模式不是可选项,是默认就该开的开关。浮点和对象这两类值,in_array 天然不适用,得换思路。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











