gpt4 book ai didi

php - 修改后的先序树遍历中的路径

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

我已经实现了修改后的预序树遍历 as explained here .我的树是这样的:

+-------+-----------+-----+-----+
| ref | name | lft | rgt |
+-------+-----------+-----+-----+
| NULL | base | 1 | 8 |
| 2 | basic | 2 | 3 |
| NULL | listener | 4 | 7 |
| 1 | test | 5 | 6 |
+-------+-----------+-----+-----+

一切正常,但现在我尝试实现一个基于路径的 PHP 搜索功能,它是这样的:

$result = searchTree('base.listener.test');
// Now $result is an array with node {1, test}

表示searchTree根据给定的路径返回一个子树。如果路径不存在,它将返回一个空数组。

我当前的实现是一个循环函数,它将树加载到 PHP 数组中,然后拆分路径并遍历数组。这似乎是一个不可扩展的实现...任何更好的实现(也许使用 mySQL 查询?)。

我目前的实现是这样的。首先我得到整棵树 (SELECT * FROM tree) 然后我执行这个函数从这个数据创建一个多维数组:

function create_tree($results) {
$return = $results[0];
array_shift($results);

if ($return['lft'] + 1 == $return['rgt'])
$return['leaf'] = true;
else {
foreach ($results as $key => $result) {
if ($result['lft'] > $return['rgt'])
break;
if ($rgt > $result['lft'])
continue;
$return['children'][] = create_tree(array_values($results));
foreach ($results as $child_key => $child) {
if ($child['rgt'] < $result['rgt'])
unset($results[$child_key]);
}
$rgt = $result['rgt'];
unset($results[$key]);
}
}

unset($return['lft'],$return['rgt']);
return $return;
}

然后我在 $tree 变量中有一个数组并执行这段代码:

$t3 = $tree;
$parts = explode('.', $path);
while (isset($parts[0]) && count($parts) > 1 && isset($t3['children']) && $parts[0] == $t3['name']) {
array_shift($parts);
for ($i = 0; $i < count($tree['children']) && $tree['children'][$i]['name'] != $parts[0]; $i++);
$t3 = $tree['children'][$i];
}

return isset($t3) && count($parts) == 1 && $parts[0] == $t3['name']? $t3['children'] : array();

最后一行返回 $path 指向的节点(即 'base.listener.test'),如果该路径不存在,则返回一个空数组。

最佳答案

如果我明白你在找什么,你想调用:

$result = searchTree('test');

然后在数据库中搜索 parent ?

SELECT p.name
FROM tree c
INNER JOIN tree p ON p.lft < c.lft AND p.rgt > c.rgt
WHERE c.name = 'test'
ORDER BY p.lft;

关于php - 修改后的先序树遍历中的路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7276935/

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