2013-01-03 91 views
0

假設我有一個一維陣列$arr像這樣:如何從循環創建樹狀數組?

Array 
(
    ['key1'] => 1 
    ['key2'] => 1 
    ['key3'] => 1 
    ['key4'] => 1 
) 

欲循環通過$arr這樣的:

foreach($arr as $key => $a) { 
    //$tree[????] = ????? Here is my concern 
} 

使得,做print_r($tree)產生

Array 
(
    ['key1'] => Array 
    (
     ['key2'] => Array 
     (
      ['key3'] => Array 
      (
       ['key4'] => 1 
      ) 
     ) 
    ) 
) 

我關心的是如何增加循環f內的數組$tree的尺寸(不是值)從單維數組$numbers這樣$tree['key1']['key2']['key3']是一個數組而$tree['key1']['key2']['key3']['key4']等於1

此外,如果我有一個單維數組$foo與10個元素。我應該生成另一個數組$bar,它擴展到與上面的輸出類似的10維數組。

我應該在foreach循環內做些什麼?或者,而不是使用循環,有沒有辦法從一維數組產生像上面那樣的輸出?


編輯:

確定好你顯然需要某種形式的遞歸函數,但可以 你能解釋一下你怎麼知道KEY2應該爲key1的孩子,KEY3 應該是一個孩子key2等基於你顯示的數據?

1D數組的下一個元素是前一個元素的子元素。因此,如果一維數組是這樣的:

Array 
(
    ['bar'] => 1 // I don't care of the values as of the moment 
    ['foo'] => 1 
    ['baz'] => 1 
) 

foo應該是bar的孩子,和元素baz應該是foo的樹陣的孩子。

好吧所以除了最後一個元素的所有東西的實際值都是 不相關?

實際上,1D數組的所有值都與此刻無關。我只關心構建樹型數組。

+1

確定好你顯然需要某種形式的遞歸函數的,但你能解釋一下你怎麼知道'key2'應該是'一個孩子根據你顯示的數據,key1','key3'應該是'key2'的一個孩子嗎? – DaveRandom

+0

Hi @DaveRandom。請參閱修改。 –

+0

好吧,除了最後一個元素之外的所有東西的實際值是不相關的? – DaveRandom

回答

3

這樣做的方法是使用引用。

function create_tree($arr) { 
    $result = array(); 
    $ref = &$result; 
    foreach ($arr as $key => $el) { 
    $ref = array($key => $el); 
    $ref =& $ref[$key]; 
    } 
    return $result; 
} 

工作原理:

$result = array(); // an array to hold the result 

$ref = &$result; // start with a reference to the top level 

foreach ($arr as $key => $el) { // iterate over the input array 

    $ref = array($key => $el); // create this level in the array 

    $ref =& $ref[$key]; // change the reference to be the new deepest level 

} 

return $result; // return the result 

See it working

+0

這工作得很好。謝謝。我從來沒有想過參考。 –

2

Assignment by reference似乎對此有用。

$tree = array(); 
$node =& $tree; 
foreach ($arr as $key => $a) { 
    $node =& $node[$key]; 
    $node = array(); 
} 
$node = end($arr); 
+0

是的,或者也是做這項工作。 – DaveRandom