首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将表的值放入树中

将表的值放入树中
EN

Stack Overflow用户
提问于 2010-05-13 11:16:42
回答 1查看 128关注 0票数 0

所以,我有一个这样的表:

代码语言:javascript
复制
id|root|kw1|kw2|kw3|kw4|kw5|name
 1|   A|  B|  C|  D|  E|  F|fileA
 2|   A|  B|   |   |   |   |fileB
 3|   B|  C|  D|  E|   |   |fileC
 4|   A|  B|   |   |   |   |fileD

(几百行...)

我需要将它放入树中,如下所示:

代码语言:javascript
复制
*A
 *B
  -fileB
  -fileD
 *C
  *D
   *E
    *F
     -fileA
*B
 *C
  *D
   *E
    -fileC

我很确定这张桌子摆放得很糟糕,但这是我不得不忍受的。

我读过一些关于邻接表模型和改进的预序树遍历的内容,但我认为我的数据布局不正确。我想这需要一个递归函数,但我完全不确定该怎么做。

我对如何做到这一点持开放态度,即使这意味着将数据提取到一个新的表中来处理它。

我有没有什么好的选择或者什么好的方法呢?(当然,示例是额外的好处)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-05-13 11:40:14

这是我能想到的最简单的工作解决方案。

假设:

您有一个由数组组成的数组(结果集);它名为$rows.

  • Empty。上面给出的结果集中的列值等于null.

  • There是树中没有分支,其名称是整数的字符串表示形式。

代码:

代码语言:javascript
复制
$tree = array();

foreach($rows as $row) {
    // Second parameter: array of 6 items as per your sample result set
    place_in_tree($tree, array($row['root'], ... $row['kw5']), $row['file']);
}

function place_in_tree(array $tree, array $path, $item) {
    // While there are more branches to be taken in $path
    while(($branch = array_shift($path)) !== null) {
        // Create the new branch if it doesn't exist
        if(!isset($tree[$branch])) {
            $tree[$branch] = array();
        }

        // Select the subtree in that branch for the next iteration
        $tree = $tree[$branch];
    }

    // Finally, add the item
    $tree[] = $item;
}

这将创建一个具有嵌套数组的数组。该数组包含许多具有字符串键的项(这些是“分支”,并且属于array类型)和许多具有数字键的项(这些是“文件”,并且属于string类型)。子数组是以同样的方式填充的。

如果你需要更接近你的业务模型,而不是一个大的喇叭数组,你可以在上面的function place_in_tree中调整分支选择和项目存储逻辑。

此外,如果上面的假设#3在您的案例中不成立,您将需要以相同的方式参与其中,要么选择一种明确的方式来区分树的分支和树叶,要么选择另一种结构来表示它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2824232

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档