in_array在PHP 8.0中默认松散比较易出错,推荐启用严格模式(第三个参数设为true)确保值与类型均匹配;松散模式下存在类型隐式转换陷阱,严格模式可避免误判,且不支持多维数组递归搜索。

in_array 在 PHP 8.0 中用法和之前版本基本一致,核心是判断某个值是否存在于数组中。关键点在于:**默认进行松散比较(类型不严格),容易出错;推荐开启严格模式(第三个参数设为 true)来避免隐式类型转换带来的误判。**
基础语法与参数说明
函数原型:
in_array(mixed $needle, array $haystack, bool $strict = false): bool
- $needle:要查找的值(支持任意类型,如字符串、数字、布尔、null,甚至数组或对象——但需注意比较逻辑)
- $haystack:被搜索的目标数组
- $strict:是否启用严格比较(默认 false)。设为 true 时,值和类型都必须完全匹配
松散比较($strict = false)的常见陷阱
PHP 会自动做类型转换,可能导致意外结果:
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
-
in_array(0, ['abc', 'def'])→ 返回 true(因为 'abc' 转为 int 是 0) -
in_array('', [0, false, null])→ 返回 true(空字符串与 0、false、null 在松散比较下都相等) -
in_array('1', [1, 2, 3])→ 返回 true(字符串 '1' 被转为整数 1)
这类行为在验证用户输入、配置项或接口返回值时极易引发逻辑漏洞。
强烈建议使用严格模式($strict = true)
显式要求值和类型同时匹配,更安全、更可预期:
立即学习“PHP免费学习笔记(深入)”;
-
in_array(0, ['abc', 'def'], true)→ false -
in_array('1', [1, 2, 3], true)→ false(字符串 ≠ 整数) -
in_array(1, [1, 2, 3], true)→ true -
in_array(true, [1, 2, 3], true)→ false(bool true ≠ int 1)
其他实用注意事项
- 对多维数组,in_array 不会递归搜索;如需深度查找,需自行封装或使用 array_walk_recursive
- 查找对象时,松散模式下只比较对象引用(即是否为同一实例),严格模式同理;若需按属性判断,应先提取字段再查
- 性能上,in_array 是线性遍历,大数据量时考虑用 array_key_exists 配合键名预处理(如将值转为键)提升效率


















