PHP多维数组查找指定值的首个路径:获取值为1260元素的路径
递归查找未知层级数组中目标元素的访问路径
我来帮你改造这个函数,让它能精准返回第一个匹配元素的完整访问路径~你的原函数只停留在找到包含目标的子数组这一步,我们需要加入路径追踪的逻辑,并且在找到第一个匹配项后立刻终止递归,避免多余遍历。
改进后的函数代码
function findElementPath($array, $target, $currentPath = []) { foreach ($array as $key => $value) { // 先检查当前元素是否就是目标值 if ($value === $target) { return array_merge($currentPath, [$key]); } // 如果当前元素是数组,递归查找 if (is_array($value)) { $newPath = array_merge($currentPath, [$key]); $result = findElementPath($value, $target, $newPath); // 递归找到结果就立即返回,终止后续遍历 if ($result !== null) { return $result; } } } // 遍历完当前层级没找到,返回null return null; }
函数工作原理
$currentPath参数用来追踪当前递归到的路径,默认是空数组,首次调用不需要传- 遍历数组时,先判断当前元素是否等于目标值:如果是,就把当前键加入路径并返回
- 如果当前元素是子数组,就把当前键加入路径,递归调用函数;如果递归返回了有效路径(不是null),直接返回这个路径,不再继续遍历其他元素
- 如果整个数组遍历完都没找到目标,返回
null
示例用法
假设我们有这样一个测试数组:
$testArray = [ 'Stats' => [ '2018' => [ '01' => 1200, '02' => 1260, '03' => 1300 ], '2019' => [ '01' => 1400 ] ], 'Other' => [1260, 1500] ];
调用函数查找1260:
$path = findElementPath($testArray, 1260); print_r($path);
输出结果(第一个匹配项的路径):
Array ( [0] => Stats [1] => 2018 [2] => 02 )
如果要查找2018-02这种字符串目标,只要数组里存在对应值,函数也能正确返回路径~
额外说明
- 函数使用
===严格比较,如果你需要宽松比较(比如1260和'1260'视为匹配),可以改成== - 路径数组里的元素会保留原数组的键类型(比如数字键、字符串键),方便后续直接通过路径访问元素:
// 根据路径获取元素值 $value = $testArray; foreach ($path as $key) { $value = $value[$key]; } echo $value; // 输出1260
内容的提问来源于stack exchange,提问作者I. Ageyev
相关产品推荐
相关产品推荐

