代码之家  ›  专栏  ›  技术社区  ›  Alex L

将修改后的预排序树遍历数据获取到数组中

  •  2
  • Alex L  · 技术社区  · 15 年前

    将树数据放入 数组 ?

    我跟着 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
                                   )
                  ) 
    
    )
    

    如果你能帮忙,我会非常感激的。

    ps.SQL输出看起来 like this (除了我有头衔,没有名字,也不使用类别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 |
    
    3 回复  |  直到 15 年前
        1
  •  6
  •   Travis    15 年前

    试一下这个代码。$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);
    
        2
  •  4
  •   Lukasz Lysik    15 年前

    我将从重写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
    

    有了这个,就容易多了。

        3
  •  0
  •   mr c    15 年前

    使用create_树,我在这一点上得到了一个错误:

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

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

    它也没有返回正确的数组数目….. 我正在使用相同的数据库结构

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