2011-11-14 30 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