【发布时间】:2012-03-06 05:20:22
【问题描述】:
我有一些分层数据需要在一系列嵌套的 UL 中显示。对于每个项目,我都有一个名称、一个 ID 和一个深度值。通常我只会按深度对这些项目进行分组,但实际上我需要用我的数据创建一个树结构,如下所示:
这是我的问题:是否有一种生成有效标记的好方法(如果我也可以使用适当的制表符将其打印出来,我会喜欢它,但这会很困难)我的数据将被包裹在嵌套的 UL 中吗?我已经有一个可行的解决方案,但我得到了一个流浪标签。这是我的代码:
<?php
include("includes/classes/Database.class.php");
$db = new Database();
$query = "SELECT COUNT(parent.Name) - 2 as level, node.Name AS Name, node.ID
FROM Region AS node, Region AS parent
WHERE node.LeftVal BETWEEN parent.LeftVal AND parent.RightVal and node.Name <> 'Earth'
GROUP BY node.ID
ORDER BY node.LeftVal";
$results = $db->executeQuery($query);
?>
<!DOCTYPE HTML>
<html lang="en-US">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<?php
$last_level = 0;
?>
<ul id="regionTree">
<?php
while ($row = mysql_fetch_assoc($results)) {
$link = '<li>'.PHP_EOL.'<a href="addChild.php?parentid='.$row["ID"].'">'.$row["Name"]."</a>".PHP_EOL;
$diff = $last_level - $row["level"];
if($diff == 0){
// Sibling
echo ($row["level"] != 0) ? '</li>'.PHP_EOL.$link:$link;
}
elseif($diff < 0){
// Child
$demoter = '<ul>'.PHP_EOL;
for ($i=0; $i > $diff; $i--) {
echo $demoter;
}
echo $link;
}
else{
// Parent
$promoter = '</li>'.PHP_EOL.'</ul>';
for ($i=0; $i < $diff; $i++) {
echo ($row["level"] != 0) ? $promoter.PHP_EOL."</li>":$promoter;
}
echo $link;
}
$last_level = $row["level"];
}
?>
</li>
</ul>
</body>
</html>
有什么想法吗?
::编辑:: 我用生成的源创建了一个不验证的 pastebin。 Pastebin.com
::编辑 2:: 这是 Region 表的架构。它是使用嵌套集模型和邻接表模型的混合设计的。
CREATE TABLE Region (
ID INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Stores the ID for the Region.',
Name VARCHAR(45) NOT NULL COMMENT 'Stores the name of the Region',
Region_Type VARCHAR(45) NOT NULL COMMENT 'Stores the Region type.',
Parent INT COMMENT 'Stores the ID of the Parent Region',
LeftVal INT NOT NULL,
RightVal INT NOT NULL,
PRIMARY KEY (ID)
) COMMENT 'Stores information about all Regions.' ENGINE=INNODB
ROW_FORMAT=DEFAULT CHARACTER SET utf8 collate utf8_general_ci;
【问题讨论】:
-
您可以发布
Region表的数据库架构吗? -
我已为您添加了该架构。
-
好的,我已经用你的架构编辑了我的答案。
标签: php html loops markup nested