使用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
相关产品推荐
相关产品推荐

