2014-02-21 159 views
0

简化问题:拥有一个拥有公司的boss和subaltern的数组,这个数组对于某些分支具有可变的深度。n维数组 - 返回值

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

@maxime请参阅编辑 – ihtus

+0

可以'[sub]'包含多个元素吗?如'[sub] => Array([userX] => ...,[userY] => ...)'? – Razvan

回答

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.