str_contains专用于字符串子串匹配,in_array专用于数组元素查找,二者作用对象、类型要求、比较逻辑均不同,不可互换。

str_contains 和 in_array 看似都是“判断是否存在”,但作用对象、底层逻辑和适用场景完全不同——一个专管字符串,一个专管数组,不能互相替代。
作用目标完全不同
str_contains 只处理字符串:判断一个字符串(haystack)里是否包含另一个子串(needle)。它不关心数组、不解析结构,只做纯文本匹配。
in_array 只处理数组:判断某个值(needle)是否作为**元素**出现在给定数组(haystack)中。它不拆解字符串,也不做子串搜索。
- str_contains('hello world', 'world') → true(子串存在)
- in_array('world', ['hello', 'world']) → true(元素完全相等)
- str_contains(['hello', 'world'], 'world') → 致命错误(第一个参数必须是字符串)
- in_array('world', 'hello world') → 致命错误(第二个参数必须是数组)
比较方式与类型要求严格不同
str_contains 要求两个参数都必须是字符串,且区分大小写;传入 null、int 或数组会直接抛出 TypeError。空字符串 '' 恒为 true:str_contains('abc', '') === true。
in_array 的 needle 可以是任意类型(字符串、数字、布尔、数组甚至对象),但默认松散比较($strict = false),容易因类型转换出错;必须显式设 true 才能确保值+类型双匹配。
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
- str_contains('ABC', 'abc') → false(大小写敏感)
- in_array('abc', ['ABC', 'def']) → false(字符串区分大小写,且不作子串匹配)
- in_array(0, ['abc', 'def']) → true(松散模式下 'abc' 转 int 为 0)
- str_contains('abc', 0) → TypeError(needle 不是字符串)
都不支持递归,但“深度”含义相反
in_array 默认只查一维数组,遇到多维数组时,不会自动展开或递归搜索内部元素。比如:in_array('x', [['x'], ['y']]) 返回 false。
str_contains 也不存在“嵌套”概念——它压根不处理数组,所以谈不上递归。如果你有 JSON 字符串想查内容,得先确保它是字符串类型,再调用 str_contains;如果它是已解码的数组,就得换 in_array 或其他逻辑。
- 想查
['a', ['b', 'c']]里有没有 'c'?→ 不能用 in_array 直接查,需自定义遍历或 array_walk_recursive - 想查
'{"items":["a","b"]}'这个字符串里有没有 'b'?→ 可用 str_contains,但注意这是文本匹配,不是结构化查询
性能与使用建议
两者都是线性扫描,数据量大时不建议高频调用。但优化方向不同:
- 查字符串子串频繁?优先用 str_contains(比 strpos !== false 更直观安全)
- 查数组元素频繁?考虑预建键名索引,改用 array_key_exists 提升到 O(1);或确认是否真需 in_array,有时 isset($arr[$key]) 更合适
- 不确定输入类型?str_contains 会报错提醒你;in_array 松散模式则可能静默返回错误结果——所以 in_array 务必加第三个参数 true
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










