Php 多级树

Php 多级树,php,mysql,arrays,Php,Mysql,Arrays,我有一个放置菜单项的db表。我的表有3列:id、parent\u id和name。我想从这个表中构建一棵树。 如何做到这一点?虽然不需要嵌套集也可以做到这一点,但嵌套集将使查询更加高效 以下是一些关于如何设置的好教程: (它实际上没有使用术语嵌套集,但第2页在标题“修改的预订单树遍历”下描述了相同的概念) 试试这段代码 $query = "SELECT * FROM menu_items"; $result = mysql_query($query); if (mysql_num_rows(

我有一个放置菜单项的db表。我的表有3列:id、parent\u id和name。我想从这个表中构建一棵树。
如何做到这一点?

虽然不需要嵌套集也可以做到这一点,但嵌套集将使查询更加高效

以下是一些关于如何设置的好教程:

(它实际上没有使用术语嵌套集,但第2页在标题“修改的预订单树遍历”下描述了相同的概念)

试试这段代码

$query = "SELECT * FROM menu_items";
$result = mysql_query($query);

if (mysql_num_rows($result) > 0) {
    $myTreeArray = array();
    while ($row = mysql_fetch_assoc($result)) {
        if(!isset($myTreeArray[$row['parent_id']])){
            $myTreeArray[$row['parent_id']] = array();
        }
        array_push($myTreeArray[$row['parent_id']], array($row['id'] => $row['name']));
    }
}

echo '<pre>';
print_r($myTreeArray);
echo '</pre>';
$query=“从菜单项中选择*”;
$result=mysql\u query($query);
如果(mysql_num_rows($result)>0){
$mytrearray=array();
while($row=mysql\u fetch\u assoc($result)){
如果(!isset($mytrearray[$row['parent_id']])){
$mytrearray[$row['parent_id']]=array();
}
数组推送($mytrearray[$row['parent\u id']],数组($row['id']=>$row['name']);
}
}
回声';
打印(MyTrearray);
回声';

这将为您提供一个关联数组,其中包含按父id索引的菜单项列表。然后,您可以循环使用
$mytrearray
并打印列表。

google
mysql嵌套集
。您需要一个递归函数,通过使用
parent\u id=$id
查询子条目,使用当前条目parent\u id来查找子条目。另请参阅,谢谢!第一个教程看起来与我的案例非常相似。嵌套集很好,但这次我的表结构没有左键和右键。@Matt-你关于使用嵌套集的建议在mysql方面对我很有帮助。我还处理数据库中的分层数据,该树总共有大约100万个节点。嵌套集是否仍然适用于我(考虑到每当在树中添加新节点时,要为左值和右值更新的节点数量)?@Slowcoder是的,我认为嵌套集是一个很好的解决方案。它很可能比使用关系数据库的任何其他方法都要快。非SQL(“NoSQL”)数据库近年来越来越流行,原因很多,其中两个是更好地支持分层数据和更好的可伸缩性,但是在大多数情况下,特别是如果你还没有构建很多系统,我会说坚持使用SQL,因为有更多的资源来学习它,而且它对大多数系统都很有效。谢谢Matt。我在报纸上读了这篇文章。缺点部分说,嵌套集可能不适合具有大量节点的树,因此我们可以使用嵌套间隔。我得看看是什么。@Slowcoder啊,有趣的是,我一直认为嵌套集是最快的,但我不是这方面的专家。当然,您应该考虑如何查询树,例如,您计划立即查询多少数据,以及是否有可能在不同的表或某些东西上分割的任何自然分区。它不起作用,可能在这行中存在一些错误,ARayay-Press($MyTreRayLay[$RealPaltIdID ] ],数组($ROC[ID])=$$行。['name']);如果您能发布行号和遇到的错误,那就太好了:)编辑了代码。现在可以了。:)谢谢!现在可以了,我可以看到关联数组。我现在需要递归php函数来构建树吗?现在只需要一个简单的嵌套foreach($mytrearray as$key=>$value)就可以了。