【问题标题】:Specific algorithm to recurse through a tree structure in PHPPHP中通过树结构递归的具体算法
【发布时间】:2012-03-13 06:37:49
【问题描述】:

在 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']]]。该算法可以支持任意深度的数组;但我的限制是一个孩子不能有多个父母。

为非标准语法道歉,我希望它能有效地传达我想要实现的目标,我认为这是深度优先搜索 - 但是我遇到的实现太枯燥了,我无法理解所以我将不胜感激。

【问题讨论】:

标签: php algorithm recursion tree


【解决方案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);

看看你得到了什么。

【讨论】:

  • 该算法可以支持任意深度的数组... 需要递归。见:stackoverflow.com/questions/2915748
  • 不,不需要递归。他预先存在的列表是 2 个级别。节点列表。将其转换为树很容易。
  • @DanRedux 他预先存在的列表有3个级别,tree = ['1' => ['2' => ['4'], '3']]]
  • 这不是他预先存在的名单。他拥有的东西在顶部。结果应该是一个数组树,但输入只是一个可以引用其他项目的项目列表。它不是一棵真正的树,只是一个列表,所以根本不需要递归。
猜你喜欢
  • 1970-01-01
  • 2011-02-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 2015-02-14
  • 1970-01-01
  • 2012-10-22
  • 1970-01-01
相关资源
最近更新 更多