高洛峰2017-04-10 16:11:37
最近刚好写了一份获取n维数组某个节点的深度和父级节点的代码,希望对题主有用
class ArrayUtil {
/**
* 深度优先遍历查找一个树形结构中,某个节点的所在位置
*
* 参数例子:
* $input: [
* 'a' => [
* 'b' => [
* 'c' => []
* ]
* ],
* 'd' => [
* ]
* ]
* $target: c
* 返回值: [3, ['a','b','c']]
*
* 可以用list($level, $pathKeys) = self::getNodeLevel(....)来进行使用
* $level表示层级
* $pathKeys表示访问到这个节点需要经过的key
*
* @param array $input 输入
* @param string $target 希望查找的节点(key或者value),例如 'f'
* @param array $pathKeys 节点数组列表
* @return null|array [$level, [$pathKey0, $pathKey1, ...]] 没有找到时会返回空
*/
public static function getNodeLevel(array $input, $target, array $pathKeys = [])
{
foreach ($input as $key => $val) {
$pathKeys[] = $key;
if ($key == $target) {
return [count($pathKeys), $pathKeys];
} elseif (is_array($val)) {
//当前范围没有找到值,递归进入下一层
$result = self::getNodeLevel($val, $target, $pathKeys);
if ($result) {
return $result;
}
}
array_pop($pathKeys);
}
return null;
}
}
使用:
$input = [
'a' => [
'b' => [
'c' => ['hello', 'world']
]
],
'd' => [
]
];
list($depth, $parents) = ArrayUtil::getNodeLevel($input, 'c');
print_r($depth); //层级,输出3
echo "\n";
print_r($parents);
/*
父级节点,输出
Array
(
[0] => a
[1] => b
[2] => c
)
*/
//获得目标节点的子数组
$target = &$input;
foreach ($parents as $key) {
$target = &$target[$key];
}
print_r($target);
/*
输出子节点
Array
(
[0] => hello
[1] => world
)
*/