Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将修改的前序树遍历数据获取到数组中_Php_Mysql - Fatal编程技术网

Php 将修改的前序树遍历数据获取到数组中

Php 将修改的前序树遍历数据获取到数组中,php,mysql,Php,Mysql,将树数据放入数组的有效方法是什么 我按照命令检索树数据 但是,本教程仅显示如何输出树,而不是如何制作多维数组 我曾经 SELECT title, lft, rgt FROM tree_structure WHERE lft BETWEEN $parentLft AND $parentRgt ORDER BY lft ASC 因此,对于每个项目,我都有它的标题、左值和右值 我一直坚持让阵列看起来像这样 Array ( Title: Main Topic Children => Arr

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

我按照命令检索树数据

但是,本教程仅显示如何输出树,而不是如何制作多维数组

我曾经

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输出看起来(除了我有标题,没有名字,也没有使用category_id):


试试这个密码$结果是数据库结果$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);
函数创建树($results){
$return=$results[0];
数组移位($results);
如果($return['lft']+1==$return['rgt'])
$return['leaf']=true;
否则{
foreach($results作为$key=>$result){
if($result['lft']>$return['rgt'])//不是子级
打破
if($rgt>$result['lft'])//不是顶级子级
继续;
$return['children'][]=创建_树(数组_值($results));
foreach($child\u key=>$child的结果){
如果($child['rgt']<$result['rgt']))
未设置($results[$child_key]);
}
$rgt=$result['rgt'];
未设置($results[$key]);
}
}
未设置($return['lft',$return['rgt');
return$return;
}
$tree=创建树($results);

我首先将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

这样做就容易多了。

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

if ($rgt > $result['lft']) //not a top-level child  continue;
它返回的错误是:未定义变量:rgt

而且它没有返回正确的数组数。。。。。 我在中使用相同的数据库结构


该查询的记录是什么样子的?@Gumbo,我使用另一篇文章中的数据作为示例。最重要的是,该算法使用左、右值来排序数据。谢谢你的帮助,但它生成的数组不正确。一旦我发现这个问题,我将尝试发布输出。数组返回此函数不正确,有些行重复。这很有效,非常感谢。起初,我有一个diff查询,结果不好,但当我修复了这个查询后,它成功了。谢谢谢谢你发布这个。我一直在寻找一个SQL脚本来添加一个特定的祖先ID(在我的例子中不是父ID),使用您的代码作为起点很容易解决这个问题。
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
if ($rgt > $result['lft']) //not a top-level child  continue;