php - 如何从数据库的平面数组中创建嵌套注释数组

标签 php sql arrays hierarchical-data

在查询数据库中嵌套在闭包表中的评论之后,就像 Bill Karwin 在此处建议的那样 What is the most efficient/elegant way to parse a flat table into a tree? ,我现在从 SQL 中得到以下数据结构:

"comments": [
            {
                "id": "1",
                "breadcrumbs": "1",
                "body": "Bell pepper melon mung."
            },
            {
                "id": "2",
                "breadcrumbs": "1,2",
                "body": "Pea sprouts green bean."
            },
            {
                "id": "3",
                "breadcrumbs": "1,3",
                "body": "Komatsuna plantain spinach sorrel."
            },
            {
                "id": "4",
                "breadcrumbs": "1,2,4",
                "body": "Rock melon grape parsnip."
            },
            {
                "id": "5",
                "breadcrumbs": "5",
                "body": "Ricebean spring onion grape."
            },
            {
                "id": "6",
                "breadcrumbs": "5,6",
                "body": "Chestnut kohlrabi parsnip daikon."
            }
        ]

我想使用 PHP 重构这个数据集,所以评论是这样嵌套的:

"comments": [
            {
                "id": "1",
                "breadcrumbs": "1",
                "body": "Bell pepper melon mung."
                "comments": [
                    {
                        "id": "2",
                        "breadcrumbs": "1,2",
                        "body": "Pea sprouts green bean."
                        "comments": [
                            {
                                "id": "4",
                                "breadcrumbs": "1,2,4",
                                "body": "Rock melon grape parsnip."
                            }
                        ]
                    },
                    {
                        "id": "3",
                        "breadcrumbs": "1,3",
                        "body": "Komatsuna plantain spinach sorrel."
                    }
                ]
            },
            {
                "id": "5",
                "breadcrumbs": "5",
                "body": "Ricebean spring onion grape."
                "comments": [
                    {
                        "id": "6",
                        "breadcrumbs": "5,6",
                        "body": "Chestnut kohlrabi parsnip daikon."
                    }
                ]
            }
        ]

我已经找到了一个解决方案,但它似乎过于复杂,而且我觉得有一些聪明的解决方案可以优雅高效地完成此任务,但我不知道如何做?

最佳答案

假设您将所有数据提取到一个由“id”索引的数组中:

while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        $nodes[$row["id"]] = $row;
}

我测试了以下内容,它可以生成您想要的 JSON 输出:

foreach ($nodes as &$node) {
        $parent = array_shift(array_slice(explode(",",$node["breadcrumbs"]), -2, 1));
        if ($parent == $node["id"]) {
                $forest["comments"][] = &$node;
        } else {
                $nodes[$parent]["comments"][] = &$node;
        }
}

print json_encode($forest, JSON_PRETTY_PRINT);

关于php - 如何从数据库的平面数组中创建嵌套注释数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19348694/

相关文章:

php - 在 MySQL 中查找两个逗号分隔字符串之间的匹配

php - 查找多维数组的键

c - 为什么我不能初始化我的数组?

arrays - 如何从命令输出的行创建一个数组

javascript - 找到值之间匹配的最简单方法是什么

php - 如何调整图像大小然后用白色背景将其集中?可以使用 php-Imagine 库来完成吗?

php - 谷歌索引 API - 403 'Forbidden Response'

php - MySQL 查询 : Epoch Time Filter

sql - 将动态参数传递给 SQL Server 2008 中的存储过程

sql - AdventureWorks db 有教程/练习吗?