
本文介绍如何将数据库查询返回的扁平化 stdClass 对象数组,转换为符合特定嵌套结构的 JSON 格式(如将部分字段归入 "file" 子对象),并避免常见赋值错误。
本文介绍如何将数据库查询返回的扁平化 stdclass 对象数组,转换为符合特定嵌套结构的 json 格式(如将部分字段归入 `"file"` 子对象),并避免常见赋值错误。
在 PHP 开发中,常需对数据库查询结果(如 PDO 或 mysqli 返回的 stdClass 对象数组)进行结构重组,以适配前端组件、第三方 API 或内部服务所需的 JSON Schema。原始数据形如:
[
{"entry": "10", "displayid": "100", "folder": "1"},
{"entry": "20", "displayid": "200", "folder": "2"}
]但目标格式要求将 entry 和 displayid 封装进 "file" 键下的对象,并保持 folder 为同级字段,且所有数值字段应为整数类型(而非字符串):
[
{"file": {"entry": 10, "displayid": 100}, "folder": 1},
{"file": {"entry": 20, "displayid": 200}, "folder": 2}
]关键在于两点:正确构造嵌套对象与显式类型转换。以下为推荐实现方式:
$newObj = []; // 初始化结果数组
foreach ($result as $res) {
$ho = new stdClass();
// 正确创建 file 子对象:使用 (object) 强制转为 stdClass,而非数组
$ho->file = (object)[
'entry' => (int)$res->entry, // 转换为整数,确保 JSON 输出无引号
'displayid' => (int)$res->displayid
];
$ho->folder = (int)$res->folder; // 同样转换 folder 类型
$newObj[] = $ho; // 必须将每个重构对象追加到数组中
}
// 最终输出标准 JSON(自动处理嵌套与类型)
echo json_encode($newObj, JSON_PRETTY_PRINT);⚠️ 常见错误分析:
立即学习“PHP免费学习笔记(深入)”;
- 原代码 $ho->file = [$ho->entry = ...] 混淆了数组赋值与对象属性设置,导致 $ho->file 成为含布尔值的数组(因赋值表达式返回值为 true),完全偏离预期;
- 遗漏 $newObj[] = $ho 导致循环中仅保留最后一个对象;
- 未做 (int) 类型转换会使 JSON 中数字带引号(如 "entry": "10"),不符合目标格式中 "entry": 10 的要求。
✅ 最佳实践建议:
- 优先使用关联数组 + json_encode()(更简洁),仅在必须返回 stdClass 时才用 (object);
- 若后续需多次复用该结构,可封装为函数或使用 array_map:
$newObj = array_map(function($res) {
return (object)[
'file' => (object)['entry' => (int)$res->entry, 'displayid' => (int)$res->displayid],
'folder' => (int)$res->folder
];
}, $result);最终生成的 JSON 将严格匹配需求格式,可直接用于 fetch 请求体、Vue/React 组件 props 或跨服务数据交换。



















