要有效地表示分层数据,请考虑使用闭包表。在这种情况下,闭包表维护树结构的祖先和后代之间的关系,从而可以有效地检索和表示层次结构。
要查询树结构,我们可以执行 SQL 查询来检索给定节点的后代及其在层次结构中的级别。下面是一个检索指定级别的后代的示例查询:
SELECT d.*, p.a AS '_parent' FROM longnames AS a JOIN closure AS c ON (c.a = a.tsn) JOIN longnames AS d ON (c.d = d.tsn) LEFT OUTER JOIN closure AS p ON (p.d = d.tsn AND p.l = 1) WHERE a.tsn = ? AND c.l <= ? ORDER BY c.l;
检索到查询结果后,我们可以处理它们以创建分层数组结构。这涉及按层次结构对行进行排序并相应地对它们进行分组,创建一个包含节点作为对象的数组,其中包含数据和子数组。
为了增强数组结构,我们可以创建自定义 Row 对象,包含行数据的关联数组及其子项的 Rowset 对象。叶节点的子行集为空。
自定义类还可以包含 toArrayDeep() 等方法,将其数据内容递归地转换为普通数组,从而轻松导出数据.
要使用此系统,可以首先获取分类表数据网关的实例,然后获取所需的树结构:
// Get an instance of the taxonomy table data gateway $tax = new Taxonomy(); // Query tree starting at Rodentia (id 180130), to a depth of 2 $tree = $tax->fetchTree(180130, 2); // Dump out the array var_export($tree->toArrayDeep());
要确定每个路径的深度,您可以将新节点插入到 Closure 表中,根据它们在层次结构中的添加位置计算适当的级别。 LAST_INSERT_ID() 函数可用于获取新插入节点的 ID。
以上是如何将数据库结果转换为分层数组对象?的详细内容。更多信息请关注PHP中文网其他相关文章!