2013-10-11 64 views
3

鑑於陣列的結構如下:訂單扁平結構成樹只知道父母

array(
    55 => array(
     'ident' => 'test 1', 
     'depth' => 1, 
    ), 
    77 => array(
     'parent_id' => 55, 
     'ident' => 'test 2', 
     'depth' => 2, 
    ) 
); 

是否有可以用來把它轉換成一個嵌套的樹一般的算法?

array(
    55 => array(
     'ident' => 'test 1', 
     'depth' => 1, 
     'children' => array(
      77 => array(
       'parent_id' => 55, 
       'ident' => 'test 2', 
       'depth' => 2, 
      ) 
     ) 
    ) 
); 

我所提供的例子被簡化,真正的殼體包括數百個節點+高達15

+0

你嘗試過什麼?我會用這個作爲出發點:http://stackoverflow.com/questions/3975585/search-for-a-key-in-an-array-recursivly –

+0

該網站上有很多這樣的問題,嘗試尋找「PHP構造分層」或類似的東西,例如:http://stackoverflow.com/questions/1060955/easiest-way-to-build-a-tree-from-a-list-of-ancestors/ 1060993#1060993 – Orbling

+0

@SergiuParaschiv只是爲了說明;你鏈接的東西有一個可怕的複雜性(至少當它在O(n)=>也可行時見下面的答案) – bwoebi

回答

4

與參考工作的深度有很大幫助的。這樣,即使他們已經插入,您仍然可以追加到孩子身上。

foreach ($array as $key => &$sub) { 
    if (isset($sub['parent_id'])) { 
     $array[$sub['parent_id']]['children'][$key] = &$sub; 
    } 
} 
unset($sub); // unset the reference to make sure to not overwrite it later... 

// now remove the entries with parents 
foreach ($array as $key => $sub) { 
    if (isset($sub['parent_id'])) { 
     unset($array[$key]); 
    } 
} 

一些演示此:http://3v4l.org/D6l6U#v500

+0

我可能是唯一一個喜歡避免像鼠疫這樣的PHP引用的人..從來沒有那麼少,有趣的答案。 – MackieeE

+1

@MackieeE地獄,引用是真棒。沒有他們,遞歸的一半東西是不可能的。 – vikingmaster

+2

@MackieeE是啊;我也試圖避免它們,但這實際上是一個非常有效的用例。因爲我無法想象其他解決方案可以在O(n)中運行,並且不使用任何引用... – bwoebi