gpt4 book ai didi

PHP RecursiveIteratorIterator 和嵌套集合

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:40:16 25 4
gpt4 key购买 nike

我在层次结构中有一组对象。有一个顶级“根”节点,它有子节点,子节点又有子节点等。我正在尝试使用嵌套集模型将这个结构保存到数据库中,其中每个节点的每个“边”都被编号以定义层次结构,如 Managing Hierarchical Data in MySQL :

alt text
(来源:mysql.com)

我的问题是计算左右值。我通常使用 RecursiveIteratorIterator 来迭代层次结构,但我不知道如何在不求助于通过引用解析索引变量的递归函数的情况下计算数字。

有什么想法吗?

它可能没有用,但这是我目前拥有的(不正确的)代码:

$iterator = new RecursiveIteratorIterator(
new Node_List(array($root)),
RecursiveIteratorIterator::SELF_FIRST);

$i = 0;
foreach ($iterator as $node) {
$node->left = ++$i;
$node->right = ++$i;
}

如你所见,这将给出如下内容:

Node 
Node
Node

左值和右值:

Node (1, 2)
Node (3, 4)
Node (5, 6)

他们应该在什么时候:

Node (1, 6)
Node (2, 3)
Node (4, 5)

最佳答案

我想通了,这是解决方案(简化):

$iterator = new RecursiveIteratorIterator(
new Site_Node_List(array($root)),
RecursiveIteratorIterator::SELF_FIRST);

$sides = array();
$s = 0;
$i = 0;
$parents = array();
foreach ($iterator as $item) {
$js = array_splice($parents, $depth, count($parents), array($i));
foreach (array_reverse($js) as $j) {
$sides[$j]['right'] = ++$s;
}
$sides[$i]['left'] = ++$s;
$i++;
}
foreach (array_reverse($parents) as $j) {
$sides[$j]['right'] = ++$s;
}

这是我实际代码的过度简化版本,因为它只是将“边”值存储在一个单独的数组中,但它演示了原理。

基本思想是将所有父节点(由深度值跟踪)存储在一个数组中,并且只在循环中写入“左”值。然后,当深度减小时,这意味着您已经回到层次结构中,因此拼接父数组以删除不再相关的数组,然后循环(反向)设置“正确”值。最后,您必须在最后循环遍历其余的父级。

关于PHP RecursiveIteratorIterator 和嵌套集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/517998/

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