You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PDO生成嵌套JSON遇结构错误,求正确层级实现方案

生成正确嵌套JSON结构的解决方案(基于数据库查询+PHP PDO)

核心思路(匹配你的三点要求)

  • 依赖数据库查询结果构建层级数组,由json_encode自动生成JSON,无需手动拼接符号
  • 核心逻辑通用,换语言/数据库只需调整语法细节,不依赖特定工具
  • 仅用基础SQL查询+简单数组遍历,避免复杂分组、Lambda或多表关联操作

第一步:编写结构化SQL查询

先通过排序确保同行星、同大洲的记录连续,后续遍历更易构建嵌套:

SELECT p.planet_name, c.continent_name, n.country_name
FROM PlanetQ p
JOIN Continents c ON p.planet_id = c.planet_id
JOIN Countries n ON c.continent_id = n.continent_id
ORDER BY p.planet_name, c.continent_name, n.country_name;

如果需要更通用,可将此查询创建为数据库视图,后续直接调用视图获取数据


第二步:PHP PDO处理查询结果并生成嵌套JSON

<?php
$dsn = 'mysql:host=localhost;dbname=your_db;charset=utf8';
$username = 'your_user';
$password = 'your_pass';

try {
    $pdo = new PDO($dsn, $username, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // 执行查询(或调用视图)
    $stmt = $pdo->query("
        SELECT p.planet_name, c.continent_name, n.country_name
        FROM PlanetQ p
        JOIN Continents c ON p.planet_id = c.planet_id
        JOIN Countries n ON c.continent_id = n.continent_id
        ORDER BY p.planet_name, c.continent_name, n.country_name
    ");
    $result = $stmt->fetchAll(PDO::FETCH_ASSOC);

    // 构建嵌套数组结构
    $nestedData = [];
    foreach ($result as $row) {
        $planet = $row['planet_name'];
        $continent = $row['continent_name'];
        $country = $row['country_name'];

        // 初始化行星层级
        if (!isset($nestedData[$planet])) {
            $nestedData[$planet] = [
                'planet' => $planet,
                'continents' => []
            ];
        }

        // 初始化大洲层级
        $continentKey = array_search($continent, array_column($nestedData[$planet]['continents'], 'continent'));
        if ($continentKey === false) {
            $nestedData[$planet]['continents'][] = [
                'continent' => $continent,
                'countries' => []
            ];
            $continentKey = count($nestedData[$planet]['continents']) - 1;
        }

        // 添加国家到大洲
        $nestedData[$planet]['continents'][$continentKey]['countries'][] = $country;
    }

    // 转换为索引数组(移除行星名作为键)
    $finalData = array_values($nestedData);

    // 输出格式化JSON
    header('Content-Type: application/json');
    echo json_encode($finalData, JSON_PRETTY_PRINT);

} catch (PDOException $e) {
    die("数据库错误: " . $e->getMessage());
}
?>

最终生成的正确JSON结构示例

[
    {
        "planet": "Earth",
        "continents": [
            {
                "continent": "Africa",
                "countries": [
                    "Egypt",
                    "Nigeria",
                    "South Africa"
                ]
            },
            {
                "continent": "Asia",
                "countries": [
                    "China",
                    "India",
                    "Japan"
                ]
            }
        ]
    }
]

内容的提问来源于stack exchange,提问作者Hannington Mambo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 20:22:35