繁体   English   中英

如何整洁地制作带有标题和子标题的列表?

[英]How to cleanly do a list with headings and sub-headings?

我正在尝试使用数据库列出带有标题的列表。 例如,我希望列表看起来像这样:

Programming
- Learn PHP
   - Make a blog using PHP
- Learn Swift - Learn Ruby

如您所见,有一个主标题, Programming ,然后是列表内容本身。 我希望能够进行嵌套列表,如Learn PHP部分以及通常的列表所示。 抱歉,这令人困惑。

我的PHP代码在这里有效:

<?php

$db = new mysqli('localhost', 'root', '', 'joshuapriestley');

$data = $db->query("SELECT * FROM goals");

while($row = $data->fetch_assoc()) {
    if($row["parent_id"] == 0) {
        echo "<ul>";
        echo "<li id=\"list-title\">" . $row["message"] . "</li>";

        $sub = $db->query("SELECT * FROM goals WHERE parent_id = " . $row["id"] . " AND sub_parent_id = 0");
        while($sub_row = $sub->fetch_assoc()) {
            echo "<li>" . $sub_row["message"];

            $sub2 = $db->query("SELECT * FROM goals WHERE sub_parent_id = " . $sub_row["id"]);
            if($sub2->num_rows != 0) {
                echo "<ul>";
                while($sub2_row = $sub2->fetch_assoc()) {
                    echo "<li>" . $sub2_row["message"] . "</li>";
                }
                echo "</ul>";
            }

            echo "</li>";
        }
        echo "</ul>";
    }
}               
?>

但对我来说,3个while循环似乎效率很低。 有一个更好的方法吗? 我有一个数据库:

数据库

parent_id用于常规项目, sub_parent_id用于子项目。

这是另一个显示结果的图像: 结果

while循环本身并不是问题(在性能方面)。 这是三个查询。 但是首先要注意的是:

  1. 这是一个嵌套集 类似的问题:数据库中的树存储,菜单导航,分层数据表示。 有很多数据库布局和算法可以查询和输出,更适合提供单查询解决方案,并且工作得很好。 我强烈建议阅读嵌套集模型。

  2. 您的数据库布局包含一个谎言:条目6的父项是5而不是2。或者您的列命名令人困惑。

因此,在第n次尝试重新发明轮子之前,请使用许多解决方案之一。 搜索引擎的关键字:嵌套集(模型)。 每个解决方案都有优点和缺点,如果您感兴趣的话,会有一些页面详细介绍...

是的,我也被烧死了。 最接近您的解决方案将存储到节点的整个路径(包括节点本身!,这在您的解决方案中缺少,id列不足以解决此问题),然后可以遍历按路径排序的列表并确定打开位置并通过查看路径组成部分(通用前缀长度=深度)来关闭<ul/ol> 但是,除了检索之外,几乎所有操作都是一件痛苦的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM