php中判断多维数组是否包含指定值需递归或迭代遍历,因in_array()仅支持一维;推荐自定义递归函数in_multi_array(),严格比较并支持任意深度,或用array_walk_recursive()配合闭包,亦可先扁平化再查。

PHP 中判断多维数组是否包含某个指定值,不能直接用 in_array(),因为它默认只检测一维。需要递归遍历或使用更灵活的方法。
方法一:自定义递归函数(推荐)
写一个支持任意深度的递归函数,逐层检查每个元素:
- 遇到子数组就递归调用自身
- 遇到非数组值就与目标值比较(注意类型是否严格)
- 找到即返回
true,全部遍历完没找到返回false
示例代码:
function in_multi_array($needle, $haystack) {
foreach ($haystack as $item) {
if ($item === $needle) {
return true;
}
if (is_array($item) && in_multi_array($needle, $item)) {
return true;
}
}
return false;
}
// 使用
$arr = [1, [2, 3, [4, 5]], 6];
var_dump(in_multi_array(5, $arr)); // true
var_dump(in_multi_array('5', $arr)); // false(严格比较)
方法二:用 array_walk_recursive(简洁但有局限)
array_walk_recursive() 会自动深入所有层级,跳过键名,只处理“叶子值”。适合简单查找,但无法中断遍历(必须走完全程),也不能区分类型。
- 需配合闭包 + 引用变量标记是否找到
- 不支持严格类型比较(除非手动加判断)
- 对含对象、资源等特殊值的数组可能报错
示例:
$found = false;
array_walk_recursive($arr, function($value) use ($needle, &$found) {
if ($value === $needle) {
$found = true;
}
});
var_dump($found);
方法三:转为扁平数组再查(适合小数据)
用 array_merge(...array_values()) 不行(只展一层),可用 json_encode + str_replace 粗略判断(不推荐用于精确匹配),或用迭代方式展开:
- 用栈或队列模拟递归,避免函数调用开销
- 适合超深数组防止递归栈溢出
- 展开后可复用
in_array(),逻辑清晰
简版迭代展开示例:
function flatten_array($arr) {
$result = [];
$stack = [$arr];
while (!empty($stack)) {
$current = array_pop($stack);
foreach ($current as $item) {
if (is_array($item)) {
$stack[] = $item;
} else {
$result[] = $item;
}
}
}
return $result;
}
$flat = flatten_array($arr);
var_dump(in_array(5, $flat, true)); // true
注意事项
实际使用时要注意几个细节:
-
类型安全:用
===而非==,避免 '1' 和 1 误判 - 性能考虑:大数组优先选迭代法,避免递归深度限制
-
特殊值处理:NaN、null、对象等需单独判断,
===对 NaN 总是 false - 键名无关:以上方法都只查值,不依赖键名
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











