
本文介绍如何将具有相同 title 字段的 JSON 数组项归类聚合,使每个唯一标题对应一个包含所有匹配 data 子项的数组,并支持按名称字母序排序。
本文介绍如何将具有相同 `title` 字段的 json 数组项归类聚合,使每个唯一标题对应一个包含所有匹配 `data` 子项的数组,并支持按名称字母序排序。
在 PHP 开发中,常需对前端传入或数据库查询出的扁平化数组进行分组处理——例如按首字母(如 "A"、"B")归类品牌列表。原始数据形如多个独立对象,每个含 "title" 和 "data" 字段;目标是将相同 title 的所有 data 合并为一个数组,并最终输出结构清晰、可直接用于接口响应的嵌套格式。
以下是一个简洁、可靠且具备排序能力的实现方案:
// 假设 $json 是原始 JSON 字符串(如题中所示)
$array = json_decode($json, true);
// 步骤 1:按 title 分组收集 data
$collect = [];
foreach ($array as $item) {
$title = $item['title'] ?? '';
if (!isset($collect[$title])) {
$collect[$title] = [];
}
$collect[$title][] = $item['data'];
}
// 步骤 2:按键(title)升序排序,确保 A、B、C 顺序
ksort($collect);
// 步骤 3:对每个分组内的 data 按 name 字段做字母升序排序
$result = [];
foreach ($collect as $title => $dataList) {
// 提取 name 列用于排序
$names = array_column($dataList, 'name');
// 多字段稳定排序(按 name 升序)
array_multisort($names, SORT_ASC, SORT_STRING, $dataList);
$result[] = [
'title' => $title,
'data' => $dataList
];
}
// 输出标准化 JSON(带缩进,便于调试)
echo json_encode($result, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);✅ 关键说明:
-
array_column(..., 'name')+array_multisort()确保每组内data按品牌名自然排序(如"Aesethetica"在"Astonos"前); -
ksort()保证标题"A"、"B"等按字典序排列,避免无序输出; - 使用
$item['title'] ?? ''防止键缺失导致 Notice 错误,增强鲁棒性; - 若原始数据中
data结构不统一(如部分含brand_id/brand_name),建议在foreach中提前标准化字段(如统一为id/name),或在排序前做字段映射。
⚠️ 注意事项:
立即学习“PHP免费学习笔记(深入)”;
- 该方案时间复杂度为 O(n log n)(主要来自排序),适用于中小型数据集(array_multisort 步骤;
- 若输入 JSON 来源不可信,请始终校验
title和data是否存在且为预期类型,避免运行时错误; - 如需支持数字/符号标题(如
"#"表示非字母开头),当前逻辑已兼容,无需额外修改。
通过以上步骤,你即可将原始扁平数组高效转换为目标嵌套结构,满足前端分类展示、API 分组响应等典型业务场景需求。



















