【问题标题】:How to cleanly do a list with headings and sub-headings?如何干净地制作带有标题和子标题的列表?
【发布时间】:2016-07-18 19:27:25
【问题描述】:

我正在尝试使用数据库制作带有标题的列表。例如,我希望列表如下所示:

编程 - 学习 PHP - 使用 PHP 制作博客
- 学习斯威夫特 - 学习红宝石

如您所见,有主标题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 循环似乎非常低效。有一个更好的方法吗?我有一个数据库:

Database

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

这是显示结果的另一张图片: Result

【问题讨论】:

    标签: php mysql database list mysqli


    【解决方案1】:

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

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

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

    因此,在您尝试第 n 次重新发明轮子之前,请使用众多解决方案中的一种。搜索引擎的关键字:嵌套集(模型)。每种解决方案都有优缺点,如果您有兴趣,可以查看详细页面...

    是的,我也被烧伤了。最接近您的解决方案存储到节点的整个路径(包括节点本身!,在您的解决方案中缺少,id 列不足),然后您可以遍历按路径排序的列表并确定打开并通过查看路径组件(常见前缀长度 = 深度)来关闭 &lt;ul/ol&gt;。不过,除了检索之外,几乎所有操作都很痛苦。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-21
      • 1970-01-01
      • 2018-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多