2012-03-12 55 views
0

在PHP递归,我有这样的结构:具体算法来通过树结构在PHP

Array 
(
    [0] = Array 
    (
     'id' => 1, 
     'parent' => 0 
    ) 

    [1] = Array 
    (
     'id' => 2, 
     'parent' => 1 
    ) 

    [2] = Array 
    (
     'id' => 3, 
     'parent' => 1 
    ) 

    [3] = Array 
    (
     'id' => 4, 
     'parent' => 2 
    ) 
) 

id是一个独特的整数,并且是parent到参考另一元件的id。如果parent为0,那么它没有父项。树结构看起来像这样:

1 -> 2 -> 4 
    -> 3 

(我希望是明确的!)。我一直在试图确定一个算法,它将生成一个嵌套数组或类似的输出来显示树层次结构,以便我可以使用它;例如一个这样的输出将是:tree = ['1' => ['2' => ['4'], '3']]]。该算法可以支持任意深度的数组;但我限制它的条件是一个孩子不能有一个以上的父母。

对于非标准语法的道歉,我希望它能有效地传达我想要实现的,这是深度优先搜索,我认为 - 但是我遇到的实现太干了,我的理解所以我会很感激一些帮助。

+0

可能的[如何将一系列父子关系转换为分层树?](http://stackoverflow.com/questions/2915748/how-can-i-convert-a-series-of -parent-child-relationships-into-a-hierarchical-tre) – jeroen 2012-03-12 22:35:14

回答

1

如果您使用该密钥作为ID,您会发现它非常容易。

$tree = array( 
    1 => array('parent' => 0), 
    2 => array('parent' => 1), 
    3 => array('parent' => 1), 
    4 => array('parent' => 2)); 

现在,您可以循环遍历所有元素,只需将它们附加到它们的父级。

$newtree = array(); 
foreach($tree as $leaf) { 
    if (!isset($newtree[$leaf['parent']])) $newtree[$leaf['parent']]=array(); 
    $newtree[$leaf['parent']][]=$leaf; } 
print_r($newtree); 

看到你得到什么。

+1

*该算法可以支持任意深度的数组...... *需要递归。请参阅:http://stackoverflow.com/questions/2915748/ – webbiedave 2012-03-12 22:43:28

+0

不,不需要递归。他预先存在的列表是2级..节点列表。从那转换到树是很容易的。 – DanRedux 2012-03-12 22:59:52

+0

@DanRedux他预先存在的列表有3个等级,'tree = ['1'=> ['2'=> ['4'],'3']]]' – jeroen 2012-03-12 23:36:31