【问题标题】:Getting Modified Preorder Tree Traversal Data into an Array将修改后的先序树遍历数据放入数组
【发布时间】:2009-09-24 18:41:38
【问题描述】:

将树数据放入数组的有效方法是什么?

我跟着sitepoint tutorial检索树数据。

但是,本教程只展示了如何输出树,而不是如何制作多维数组。

我用过

SELECT title, lft, rgt FROM tree_structure WHERE lft BETWEEN $parentLft  AND $parentRgt ORDER BY lft ASC

所以对于每个项目,我都有它的标题、左右值。

我坚持让数组看起来像这样

Array
(
 Title: Main Topic
 Children => Array
             (
              => Title: subTopic
                     Leaf:  true
              => Title: Another subtopic
                     Children =>  Array
                               (
                                => Title: subtopic child
                                  Leaf: true
                               )
              ) 

)

如果您能提供帮助,我将不胜感激。

附言。 sql 输出看起来像 like this (除了我有标题,没有名字并且不使用 category_id ):

+-------------+----------------------+-----+-----+
| category_id | name                 | lft | rgt |
+-------------+----------------------+-----+-----+
|           1 | ELECTRONICS          |   1 |  20 |
|           2 | TELEVISIONS          |   2 |   9 |
|           3 | TUBE                 |   3 |   4 |
|           4 | LCD                  |   5 |   6 |
|           5 | PLASMA               |   7 |   8 |
|           6 | PORTABLE ELECTRONICS |  10 |  19 |
|           7 | MP3 PLAYERS          |  11 |  14 |
|           8 | FLASH                |  12 |  13 |
|           9 | CD PLAYERS           |  15 |  16 |
|          10 | 2 WAY RADIOS         |  17 |  18 |

【问题讨论】:

  • 该查询的记录是什么样的?
  • @Gumbo,我使用另一篇文章中的数据作为示例。主要是这个算法使用左右值对数据进行排序。

标签: php mysql


【解决方案1】:

试一试这段代码。 $results 是数据库结果。 $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']) //not a child
                break;
            if ($rgt > $result['lft']) //not a top-level child
                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 = create_tree($results);

【讨论】:

  • 感谢您的帮助,但它制作的数组并不正确,一旦我弄清楚了,我会尝试发布输出
  • 这个函数返回的数组不正确,有些行重复。
  • 这行得通,非常感谢。起初,我有一个 diff 查询并得到了不好的结果,但是当我修复查询时,它起作用了。谢谢!
【解决方案2】:

我将从重写 SQL 查询开始:

SELECT title, (SELECT TOP 1 title 
               FROM tree t2 
               WHERE t2.lft < t1.lft AND t2.rgt > t1.rgt    
               ORDER BY t2.rgt-t1.rgt ASC) AS parent
FROM tree t1
ORDER BY rgt-lft DESC

这会给你这样的结果:

title                | parent
----------------------------------------------
ELECTRONICS          | NULL
PORTABLE ELECTRONICS | ELECTRONICS
TELEVISIONS          | ELECTRONICS
MP3 PLAYERS          | PORTABLE ELECTRONICS
FLASH                | MP3 PLAYERS
CD PLAYERS           | PORTABLE ELECTRONICS
2 WAY RADIOS         | PORTABLE ELECTRONICS
TUBE                 | TELEVISIONS
LCD                  | TELEVISIONS
PLASMA               | TELEVISIONS

有了这个,就容易多了。

【讨论】:

  • 感谢您发布此信息。我一直在寻找一个 SQL 脚本来添加特定的祖先 ID(在我的情况下不是父 ID),并且使用您的代码作为起点很容易解决。
【解决方案3】:

此时使用 create_tree 我遇到了错误:

if ($rgt > $result['lft']) //not a top-level child  continue;

它返回的错误是:未定义的变量:rgt

而且它没有返回正确数量的数组..... 我在

中使用相同的数据库结构

http://articles.sitepoint.com/article/hierarchical-data-database/2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-19
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多