简化问题:拥有一个包含公司老板和下属的数组,这个数组对于某些分支具有可变深度。
EX:
Array (
[boss] => Array (
[id] => boss
[pid] => root
[sub] => Array (
[user1] => Array (
[id] => user1
[pid] => boss
[sub] => Array (
[user1_1] => Array (
[id] => user1_1
[pid] => user1
)
)
[user2] => Array (
[id] => user2
[pid] => boss
[sub] => Array (
[user2_1] => Array (
[id] => user2_1
[pid] => user2
)
[user2_2] => Array (
[id] => user2_2
[pid] => user2
)
)
)
)
)
)
问题:解析数组中每个分支(具有动态深度)的最优雅方法是从数组中提取/搜索某些数据。
递归函数是唯一的方法吗?
我还检查了array_walk_recursive()
,但我猜它不能返回值,它只能修改数组值或键(当使用引用时)。
编辑:
我正在寻找的提取:收集特定用户的所有老板,这意味着直接老板和老板的老板......等等。
答案 0 :(得分:0)
您可以使用基于堆栈的算法,如下所示:
function lookup_array($array, $needle) {
$parents = array();
$stack = array(reset($array));
while ($stack) {
$element = array_pop($stack);
if ($element['id'] == $needle) {
break;
}
else if (isset($element['sub'])) {
$parents[] = $element['id'];
$stack = array_merge($stack, array(array('id' => $element['id'])), $element['sub']);
}
else if (end($parents) == $element['id']) {
array_pop($parents);
}
}
return $parents;
}
它的工作原理如下:
$parents = lookup_array($array, 'user2_1');
print_r($parents); // Array ( [0] => boss [1] => user2 )