修改预序树遍历中的路径



我已经实现了一个修改的预购树遍历。我的树是这样的:

+-------+-----------+-----+-----+
| 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树),然后我执行这个函数,从这个数据创建一个多维数组:

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();

最后一行返回$路径所指向的节点。

如果此路径不存在,则为空数组。

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

$result = searchTree('test');

和得到搜索数据库的父母?

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;

最新更新