2011-11-14 26 views
3
Array 
(

    [178] => Array 
     (
     ) 

    [179] => Array 
     (
      [180] => 
      [181] => 
      [182] => 
      [183] => 
     ) 

    [184] => Array 
     (
      [185] => 
     ) 

    [186] => Array 
     (
     ) 

    [189] => Array 
     (
      [190] => 
     ) 

    [181] => Array 
     (
      [191] => 
      [192] => 
     ) 

    [192] => Array 
     (
      [194] => 
     ) 

) 

我有一个'链表',这个PHP数组是所有节点的列表。我已经使用密钥来存储唯一的MySQL ID供以后查找。 你会发现,在第二级阵列的一些密钥是相同的第一级。我想加入这些数组,使得较低级别以递归方式加入到较高级别。操纵嵌套多维数组

例如,179 - > 181 - > 192 - > 194

可能有许多节点的水平,不正是我在这个例子中。 如何递归添加所有节点连成正确的顺序?

UPDATED我也有一个节点上所有结束的数组,即没有更多节点的ID。

阵列 ( [0] => 178 [1] => 180 [2] => 182 [3] => 183 [4] => 185 [5] => 186 [6] => 190 [7] => 191 [8] => 194 )

+1

我怀疑一个更好的数据库查询将检索你想要的数据不得不重做它在PHP – 2011-11-14 02:52:22

+0

你可以使用递归函数的任务。 – mario

+0

在第二级的哪些节点是相同的第一电平? – Homer6

回答

2

我还不能肯定这是你在找什么,我敢肯定有很多更有效的办法去做这个。但这里有一个镜头吧:

给你上面提到的输入例子。

此代码:

function index_nodes($nodes, &$index) { 
    foreach($nodes as $key => $value) { 
     if ($value) { 
      $index[$key] = $value; 
      index_nodes($value, $index); 
     } 
    } 
} 

function nest_list($list) { 
    $index = array(); 
    index_nodes($list, $index); 

    // Construct tree 
    $build_tree = function(&$value, $key) use ($index, &$updated) { 
     if(array_key_exists($key, $index)) { 
      $value = $index[$key]; 
      $updated = true; 
     } 
    }; 

    // This needs done several times, since I can't be sure I nested things 
    // in the perfect order. 
    do { 
     $updated = false; 
     array_walk_recursive($list, $build_tree); 
    } while($updated); 

    return $list; 
} 

像下面这样运行:

$list2 = nest_list($list); 
print_r($list2); 

提供了以下的输出:

Array 
(
    [178] => 
    [179] => Array 
     (
      [180] => 
      [181] => Array 
       (
        [191] => 
        [192] => Array 
         (
          [194] => 
         ) 
       ) 
      [182] => 
      [183] => 
     ) 
    [184] => Array 
     (
      [185] => 
     ) 
    [186] => 
    [189] => Array 
     (
      [190] => 
     ) 
    [181] => Array 
     (
      [191] => 
      [192] => Array 
       (
        [194] => 
       ) 

     ) 
    [192] => Array 
     (
      [194] => 
     ) 
) 

再次......一大堆的代码,但我认为它让你更接近你的目标。

+0

亚当,非常感谢!你已经把我放在正确的道路上;) – Justin