n维数组 - 返回值

时间:2014-02-21 21:29:13

标签: php recursion multidimensional-array

简化问题:拥有一个包含公司老板和下属的数组,这个数组对于某些分支具有可变深度。

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(),但我猜它不能返回值,它只能修改数组值或键(当使用引用时)。

编辑:

我正在寻找的提取:收集特定用户的所有老板,这意味着直接老板和老板的老板......等等。

1 个答案:

答案 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 ) 

Click here for DEMO.