【发布时间】:2020-03-22 20:17:16
【问题描述】:
我想计算树结构任何级别中所有子项的数量。树不是二元的,所以一个节点可以有两个以上的孩子。 现在我创建了一个递归函数来完成这项工作,但它真的很慢。我需要一个更快的方法,但我不能用其他任何方法。
所以,假设我们有这张桌子:
NodeID | ParentID
-------------------
1 | 0
2 | 1
3 | 1
4 | 2
5 | 1
6 | 2
7 | 3
8 | 5
9 | 6
10 | 8
11 | 6
11 | 6
• 1
• 2
• 4
• 6
• 9
• 11
• 12
• 3
• 7
• 5
• 8
• 10
所以,如果我想获取节点 1 的子节点编号,数字应该是 11 而不是 3。节点 2 也是如此。数字应该是 5 而不是 2。
这是我在 PHP 中创建的递归函数,但它很慢:
function count_all_nodes($connection, $element_id, $elements=false, $i=0) {
if (!$elements) {
$result = mysqli($connection, "SELECT `node_id`, `parent_id` FROM `elements`");
while ($row = mysqli_fetch_array($result)) {
$sub_elements["node_id"] = $row["node_id"];
$sub_elements["parent_id"] = $row["parent_id"];
$elements[] = $sub_elements;
}
}
foreach ($elements as $element) {
if ($element["parent_id"] == $element_id) {
$i++;
$i += count_all_nodes($connection, $element_id, $elements);
}
}
return $i;
}
有什么办法可以避免这个递归函数?
谢谢!
【问题讨论】:
-
当你进行递归调用时,我认为你应该传递 node_id 而不是 $element_id。 “慢”是指它永远不会终止?
-
@Olivier 我必须使用大量数据,它是用于 web 应用程序的。计算所有数据需要很长时间,而且在某些情况下它永远不会加载。
-
@cHao 我认为它确实有效,但我正在寻找 PHP 中的函数,而不是纯 MySQL,因为我想用它来创建一些类似的函数,来计算这些节点的其他一些列将有。不过,谢谢!我以前没看过这个帖子,我看看能不能用。
标签: php sql recursion tree hierarchical-data