2013-03-22 91 views
0

我想從數據庫中獲得的一維數組創建一個分層數組。語言是PHP。從一維數組創建分層陣列

在下面提到的例子中,key id -3表示它是根節點。

輸入數據:

Array 
(
    [-2] => Array 
      (
       [data] => A-2 
       [attr] => Array 
       (
        [id] => -2 
        [parent_id] => -3 
        [title] => A-2 
       ) 
       [state] => open 
      } 
    [-1] => Array 
      (
       [data] => A-1 
       [attr] => Array 
       (
        [id] => -1 
        [parent_id] => -2 
        [title] => A-1 
       ) 
       [state] => open 
      } 
    [0] => Array 
      (
       [data] => A0 
       [attr] => Array 
       (
        [id] => 0 
        [parent_id] => -1 
        [title] => A0 
       ) 
       [state] => open 
      } 
    [1] => Array 
      (
       [data] => A1 
       [attr] => Array 
       (
        [id] => 1 
        [parent_id] => -1 
        [title] => A1 
       ) 
       [state] => open 
      } 
    [2] => Array 
      (
       [data] => A2 
       [attr] => Array 
       (
        [id] => 2 
        [parent_id] => -1 
        [title] => A2 
       ) 
       [state] => open 
      } 
    [3] => Array 
      (
       [data] => A3 
       [attr] => Array 
       (
        [id] => 3 
        [parent_id] => 2 
        [title] => A3 
       ) 
       [state] => open 
      } 
    [4] => Array 
      (
       [data] => A4 
       [attr] => Array 
       (
        [id] => 4 
        [parent_id] => 2 
        [title] => A4 
       ) 
       [state] => open 
      } 
    [5] => Array 
      (
       [data] => A5 
       [attr] => Array 
       (
        [id] => 5 
        [parent_id] => -2 
        [title] => A5 
       ) 
       [state] => open 
      } 
} 

輸出預計數據:

Array 
(
    [-2] => Array 
    (
     [data] => A-2 
     [attr] => Array 
     (
      [id] => -2 
      [parent_id] => -3 
      [title] => A-2 
     ) 
     [state] => open 
     [children] => Array 
     (
      [-1] => Array 
      (
       [data] => A-1 
       [attr] => Array 
       (
        [id] => -1 
        [parent_id] => -2 
        [title] => A-1 
       ) 
       [state] => open 
       [children] => Array 
       (
        [0] => Array 
        (
         [data] => A0 
         [attr] => Array 
         (
          [id] => 0 
          [parent_id] => -1 
          [title] => A0 
         ) 
         [state] => open 
        } 
        [1] => Array 
        (
         [data] => A1 
         [attr] => Array 
         (
          [id] => 1 
          [parent_id] => -1 
          [title] => A1 
         ) 
         [state] => open 
        } 
        [2] => Array 
        (
         [data] => A2 
         [attr] => Array 
         (
          [id] => 2 
          [parent_id] => -1 
          [title] => A2 
         ) 
         [state] => open 
         [children] => Array 
         (
          [3] => Array 
          (
           [data] => A3 
           [attr] => Array 
           (
            [id] => 3 
            [parent_id] => 2 
            [title] => A3 
           ) 
           [state] => open 
          } 
          [4] => Array 
          (
           [data] => A4 
           [attr] => Array 
           (
            [id] => 4 
            [parent_id] => 2 
            [title] => A4 
           ) 
           [state] => open 
          } 
         ) 
        ) 
       ) 
      ) 
      [5] => Array 
      (
       [data] => A5 
       [attr] => Array 
       (
        [id] => 5 
        [parent_id] => -2 
        [title] => A5 
       ) 
       [state] => open 
      ) 
     ) 
    ) 
) 

回答

0
$a1 = array(... your data is here ...); 
$a2 = array(); # there are root nodes 
$root_ids = array(); 

foreach($a1 as &$a) 
{ 
    if(isset($a1[$a['attr']['parent_id']])) 
     $a1[$a['attr']['parent_id']]['children'][$a['attr']['id']] = &$a; 
    else 
     $a2[$a['attr']['id']] = &$a; 
} 

print_r($a2); 

的技巧是使用& $這給了我們一個符號引用,而不是變量的副本。基本上非根節點連接到父節點,並且根節點轉到結果數組。