1

我正在阅读以下关于“在数据库中存储分层数据”的文章http://articles.sitepoint.com/article/hierarchical-data-database/2 。

这是在谈论这些结构。http://sitepointstatic.com/graphics/sitepoint_numbering.gifhttp://sitepointstatic.com/graphics/table02.gif

我不明白下面的段落。这些是什么意思。

“每次从节点的子节点开始时,都会将该节点的正确值添加到堆栈中。”

“当你显示完一个节点时,你从堆栈中删除它的正确值。如果你计算堆栈中的元素,你将得到当前节点的级别。”

如果可能的话,我希望有人以更简单的方式解释这些。

为了显示树结构,子级的缩进应该比父级稍多。我们可以通过保留一堆正确的值来做到这一点。每次从节点的子节点开始时,都将该节点的正确值添加到堆栈中。你知道那个节点的所有子节点的正确值都小于父节点的正确值,所以通过比较当前节点的正确值和堆栈中最后一个正确的节点,你可以看看你是否还在显示该父母的孩子。当您完成显示一个节点时,您从堆栈中删除它的正确值。如果您计算堆栈中的元素,您将获得当前节点的级别。

4

1 回答 1

2

他们试图想出一种方法来使用嵌套集按树中的级别缩进数据。

Food (1,12)
|
+--Fruit (2,11)
  |
  +--Red (3,6)
  | |
  | +--Cherry (4,5)
  |
  +--Yellow (7,10)
    |
    +--Banana (8,9)

因此,当您获取行时,您将rgt数字推送到数组的末尾:

$right[] = $row['rgt'];

该数组随着您处理子项和子项而增长。例如,当我们到达“Cherry”时,数组看起来像这样:

array(11, 6, 5)

只要我们沿着树的一个分支下降,其中的rgt值就应该越来越少,因为孩子的rgt价值总是小于其父母的rgt价值。

我们处理的下一行是“黄色”,它的rgt值为 10。这个值 10大于数组中的最后一个值,这意味着我们不再沿着一个分支下降,而是在另一个分支上。我们需要从数组中弹出数字,直到 10 不再大于数组中的最后一个数字。

array(11, 6) // 10 is still greater than 6
array(11)    // 10 is not greater than 11, so stop

现在我们知道该数组只包含我们当前行“黄色”的祖先。

树中的级别始终等于该数组中的元素数。

于 2009-12-22T22:18:47.283 回答