我对这个问题有点困惑,我已经考虑了一段时间了。我的数据库中有一个包含任务的表。通过在 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 - 构建树 View ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2087919/