gpt4 book ai didi

php - 构建 TreeView

转载 作者:可可西里 更新时间:2023-11-01 07:24:15 24 4
gpt4 key购买 nike

我对这个问题有点困惑,我已经考虑了一段时间了。我的数据库中有一个包含任务的表。通过在 parent_id 字段中保存它的主键,每个任务都可以有一个父任务。我对这些任务的链接深度没有限制。

+-----------+-------+-----+
| Field | Type | Key |
+-----------+-------+-----+
| id | int | PRI |
| parent_id | int | MUL |
+-------------------+-----+

没有 parent_id 的任务是一个“项目”,所有任务都可以通过共享父任务来分组到任务组中。我现在想用项目的所有后代填充一个 HTML 选择框。

Task 1
-Task 1.1
-Task 1.2
-Task 1.2.1
-Task 1.2.2
-Task 1.3
Task 2

我该怎么做?我想某种递归函数是有序的,但我似乎无法真正想出如何去做。

如有任何帮助,我们将不胜感激。 :)

最佳答案

我强烈建议您阅读这篇关于 storing hierarchical data in a database 的文章.那里讨论了两种算法,根据您的需要,其中一种可能是合适的。

邻接表模型

这是您目前拥有的。树的每个节点都存储对其父节点的引用,您可以通过选择树的每个级别并遍历节点来递归地确定到节点的路径。这个实现起来简单,但是缺点是要确定到某个节点的具体路径,需要递归查询。如果您的树受到大量更改(即写入)的影响,这是一个很好的方法,因为动态查找每个节点可以很好地处理不断变化的树。如果它是大量读取的,则递归中会产生一些开销。

改进的预序树遍历

我最喜欢的,这是一个非常巧妙的算法。不是存储对父节点的引用(为方便起见,您无论如何都可以这样做),而是为每个给定节点存储对“左”和“右”节点的引用。可以在单个选择查询中确定到一个节点的整个路径,或者相反,一个节点的所有子节点。该算法更难实现,但它对读取繁重的树具有性能优势。缺点是每次移动或添加节点时,都必须重新计算树的整个分支,因此它可能不适合写入密集型数据集。

无论如何,希望这篇文章能给你一些想法。这是一个很好的。

关于php - 构建 TreeView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2087919/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com