我不确定这是否完全符合您的要求,但值得注意的是,在MySQL中,您可以通过使用GROUP_CONCAT并扩展http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/中的“检索单个路径”示例,获取整个树形结构,每条路径作为一个字符串,每行一条。
SELECT
GROUP_CONCAT(parent.name ORDER BY parent.lft ASC SEPARATOR '|')
FROM nested_category AS node
CROSS JOIN nested_category AS parent
WHERE
node.lft BETWEEN parent.lft AND parent.rgt
GROUP by node.id
ORDER BY node.lft;
这将输出树中每个节点的路径。
注意,nested_category AS node CROSS JOIN nested_category AS parent
等同于 nested_category AS node, nested_category AS parent
。
如果您想将其展开为路径元素数组并且知道存在不在数据中的字符串,则可以指定该字符串作为分隔符,本示例使用 '|'
作为分隔符。
<?php
$children = mysql_query('SELECT * FROM nested_category ORDER BY lft ASC');
/* Get the first child; because the query was ordered by lft ASC, this is
the "root" of the tree */
$child = mysql_fetch_object($children);
$root = new StdClass;
$root->id = $child->folderID;
$root->children = array();
/* Store a reference to the object by the id, so that children can add
themselves to it when we come across them */
$objects = array($root->id => $root);
/* Build a tree structure */
while ($child = mysql_fetch_object($children)) {
/* Create a new wrapper for the data */
$obj = new StdClass;
$obj->id = $child->id;
$obj->children = array();
/* Append the child to the parent children */
$parent = $objects[$child->parent];
$parent->children[] = $obj;
$objects[$obj->id] = $obj;
}
看了你的链接,我会使用左连接来实现。可以参考检索完整树的示例。
SELECT t1.name AS lev1, t2.name as lev2, t3.name as lev3, t4.name as lev4
FROM category AS t1
LEFT JOIN category AS t2 ON t2.parent = t1.category_id
LEFT JOIN category AS t3 ON t3.parent = t2.category_id
LEFT JOIN category AS t4 ON t4.parent = t3.category_id
WHERE t1.name = 'ELECTRONICS';
如果要包含每个层级,您需要为每个层级使用一个左连接。
然后,可以通过 PHP 将结果解析为任何所需的数据结构。只需忽略 NULL
结果即可。
| ELECTRONICS | TELEVISIONS | TUBE | NULL |
| ELECTRONICS | TELEVISIONS | LCD | NULL |
| ELECTRONICS | TELEVISIONS | PLASMA | NULL |
| ELECTRONICS | PORTABLE ELECTRONICS | MP3 PLAYERS | FLASH |
| 电子产品 | 便携式电子产品 | CD播放器 | NULL |
| 电子产品 | 便携式电子产品 | 双向无线电 | NULL |
当您有一个深层结构时,这将是一种更糟糕的方法,因为MySQL连接需要很长时间来执行,当需要连接许多表时。
我希望我没有误解您的问题。
我必须告诉你一种使用PHP处理树形结构的方法,而不需要使用递归。我认为你非常熟悉标准PHP库(SPL)。你可以使用迭代器来解决你的问题。
http://www.php.net/~helly/php/ext/spl/
这里是 SPL 文档的链接。以下是针对你上面提到的 Mysql 链接的一些解决方案:通过从表中检索数组,您可以对它们进行操作并按照您的喜好显示。
对于:邻接列表模型
您可以使用“RecursiveIteratorIterator”,它将显示所有结果,包括所有子项。
如果您只想显示子项,则可以使用“ParentIterator”。