
本文介绍如何将扁平化的 MySQL 查询结果(每人多条技能记录)重构为按人员分组的嵌套 JSON 格式,使用 PHP 数组键聚合实现 name → skills[skill_name => skill_score] 的结构转换。
本文介绍如何将扁平化的 mysql 查询结果(每人多条技能记录)重构为按人员分组的嵌套 json 格式,使用 php 数组键聚合实现 `name → skills[skill_name => skill_score]` 的结构转换。
要实现从“每行一人一技能”的扁平结构,转换为“每人一个对象、其 skills 为技能名到分数的关联映射”,关键在于利用姓名作为临时数组键进行累积聚合,而非简单追加到索引数组中。
以下是优化后的完整函数示例:
function getList() {
$sql = "SELECT DISTINCT
`person`.`person_name` AS name,
`skill`.`skill_name` AS skill,
`skill_linker`.`skill_score` AS skill_score
FROM `person`
INNER JOIN `skill_linker` ON `person`.`person_id` = `skill_linker`.`person_id`
INNER JOIN `skill` ON `skill_linker`.`skill_id` = `skill`.`skill_id`";
$result = $GLOBALS['conn']->query($sql);
if ($result && $result->num_rows > 0) {
$grouped = [];
while ($row = $result->fetch_assoc()) {
$name = $row['name'];
// 初始化该人的数据结构(若首次出现)
if (!isset($grouped[$name])) {
$grouped[$name] = [
'name' => $name,
'skills' => []
];
}
// 将技能名作为键、分数作为值存入 skills 关联数组
$grouped[$name]['skills'][$row['skill']] = (int)$row['skill_score'];
}
// 转换为纯索引数组(去除姓名键),便于 JSON 序列化
$output = array_values($grouped);
header('Content-Type: application/json; charset=utf-8');
echo json_encode($output, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
} else {
header('Content-Type: application/json; charset=utf-8');
echo json_encode([], JSON_UNESCAPED_UNICODE);
}
}
✅ 关键要点说明:
详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。
- 使用 $grouped[$name] 作为中间聚合容器,自动去重并归集同一人的所有技能;
- skills 字段定义为关联数组("Dancing" => 3),符合目标 JSON 中 "skills": { "Dancing": 3, ... } 的语义(注意:原问题示例中 "skills": [ "Dancing": 3 ] 实际为无效 JSON,正确格式应为对象 {} 而非数组 []);
- 强制类型转换 (int)$row['skill_score'] 避免字符串型分数(如 "3")导致前端解析歧义;
- 使用 array_values() 将关联数组转为连续数字索引数组,确保输出为标准 JSON 列表;
- 添加 header() 和 JSON_UNESCAPED_UNICODE 提升兼容性与可读性。
⚠️ 注意事项:
- 确保 SQL 中 person_name 唯一性或业务上允许同名不同人(否则会意外合并);如需支持同名区分,建议改用 person_id 作为聚合键,并在最终输出中保留 name 字段;
- 若数据库中存在 NULL 技能或空姓名,需在循环内增加空值校验(if (empty($name) || empty($row['skill'])) continue;);
- 生产环境请避免直接使用 $GLOBALS['conn'],推荐依赖注入或封装数据库实例。
通过这种键驱动的聚合方式,无需多次查询或复杂嵌套逻辑,即可高效完成数据结构重塑,兼顾性能与可维护性。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










