PHP如何递归获取数组中指定键关联的所有嵌套层级值
原函数存在的问题
- 递归调用
arrayTraverse后未接收返回的新结果集,递归查询到的关联值没有合并到当前的$returndata中,导致只有第一层结果被返回 - 未做重复节点校验,如果数组存在环形引用(比如A指向B,B又指向A)会触发递归死循环
- 每次递归遍历全数组效率偏低,可直接用
isset($array[$targetKey])快速判断目标键是否存在,无需遍历所有键
正确实现代码
function arrayTraverse($targetKey, $array, &$returndata = [], &$visited = []) { // 已访问过的键或不存在的键直接跳过,避免死循环 if (isset($visited[$targetKey]) || !isset($array[$targetKey])) { return; } // 标记当前键已访问 $visited[$targetKey] = true; // 遍历当前键对应的所有关联值 foreach ($array[$targetKey] as $val) { $returndata[] = $val; // 递归查询当前值作为键对应的关联内容 arrayTraverse($val, $array, $returndata, $visited); } } // 调用示例 $sourceArray = [ 22 => [1074, 1926], 1772 => [1080, 1921], 1926 => [1772], 1080 => [1833] ]; $result = []; arrayTraverse(1926, $sourceArray, $result); print_r($result);
输出结果
Array ( [0] => 1772 [1] => 1080 [2] => 1833 [3] => 1921 )
注:上述实现用引用传参处理结果集和访问标记,所有递归操作都修改同一个变量,无需每次调用合并返回值,逻辑更简洁性能也更好。
内容的提问来源于stack exchange,提问作者Anil Singh
相关产品推荐
相关产品推荐

