PHP多维数组递归查找匹配键/值父键的函数问题求助
我来帮你搞定这个递归查找的问题!先拆解下你原来两个函数的问题,再给你一个符合需求的完整实现。
问题分析
先看你原来的两个函数哪里出了问题:
第一个函数的问题
你的第一个函数只处理了值在直接子数组里的情况,而且完全没考虑搜索键的场景:
- 它只通过
in_array($needle, $value)检查值是否在当前子数组中,但如果目标值在更深的嵌套数组里(比如broccoli在leafy的子数组中),当遍历到vegetables时,$value是["leafy" => [...]],in_array只会检查这个数组的值(也就是leafy的子数组),不会深入,所以会错过匹配; - 完全没有检查当前键是否等于目标,所以无法处理搜索键(比如
leafy)的需求。
第二个函数的问题
这个函数的问题有两个:
- 没有检查当前键是否是目标:当你要搜索
leafy这种键时,它只会检查值是否匹配,完全忽略了键的判断,所以找不到结果; - 找到值时会逐层返回父键:比如搜索
broccoli,它会从最内层的索引数组返回0,然后逐层往上返回leafy、vegetables,最终返回顶层的vegetables,而不是你需要的直接父键leafy。
解决方案
我们需要一个能同时处理搜索值返回直接父键和搜索键返回父键的递归函数,核心是在递归时跟踪当前数组的父键,并且同时检查键和值的匹配情况:
function findParentKey(array $haystack, $needle, $parentKey = null) { foreach ($haystack as $currentKey => $currentValue) { // 情况1:当前键就是目标,返回它的父键 if ($currentKey === $needle) { return $parentKey; } if (is_array($currentValue)) { // 情况2:当前子数组包含目标值,返回当前键(即该值的直接父键) if (in_array($needle, $currentValue)) { return $currentKey; } // 递归遍历子数组,传递当前键作为子数组的父键 $result = findParentKey($currentValue, $needle, $currentKey); if ($result !== null) { return $result; } } else { // 情况3:当前值就是目标,返回它所在数组的父键 if ($currentValue === $needle) { return $parentKey; } } } // 未找到匹配项 return null; }
测试验证
用你的示例数组测试:
$array = [ "fruits" => [ "sweet" => ["apple", "banana"], "citrus" => ["lemon", "orange"] ], "vegetables" => [ "leafy" => ["spinach", "broccoli"] ] ]; // 搜索值"broccoli",返回"leafy" echo findParentKey($array, "broccoli"); // 输出: leafy // 搜索键"leafy",返回"vegetables" echo findParentKey($array, "leafy"); // 输出: vegetables // 搜索值"apple",返回"sweet" echo findParentKey($array, "apple"); // 输出: sweet // 搜索键"sweet",返回"fruits" echo findParentKey($array, "sweet"); // 输出: fruits
这个函数完美覆盖了你需要的两种场景,逻辑清晰,递归时正确跟踪父键,不会出现逐层返回的问题。
内容的提问来源于stack exchange,提问作者Sagar Guhe
相关产品推荐
相关产品推荐

