
本文介绍如何将具有相同 title 字段的数组项归类合并,使每个 title 对应一个包含所有匹配 data 的子数组,并支持按 name 字段排序,最终生成符合要求的嵌套 json 结构。
本文介绍如何将具有相同 title 字段的数组项归类合并,使每个 title 对应一个包含所有匹配 data 的子数组,并支持按 name 字段排序,最终生成符合要求的嵌套 json 结构。
在 PHP 开发中,常需对 API 响应或前端展示数据进行分组聚合处理。例如,将品牌列表按首字母(即 title)归类,每个字母下聚合多个品牌对象,并以统一结构返回。原始数据为扁平数组,每项含 title 和单个 data 对象;目标是将其转换为每个 title 对应一个 data 数组的嵌套结构,并可选地对子数组内元素按名称升序排列。
实现的核心逻辑分为三步:分组收集 → 子数组排序 → 重构输出。以下是完整、可直接运行的解决方案:
// 假设 $json 是你接收到的原始 JSON 字符串(如题中所示)
$json = '[{"title":"A","data":{"id":"317","name":"Aesethetica"}},{"title":"A","data":{"id":"318","name":"Astonos"}},{"title":"B","data":{"id":"320","name":"Bourjois"}},{"title":"B","data":{"id":"321","name":"Bioderma"}}]';
$array = json_decode($json, true);
// 步骤1:按 title 分组收集所有 data
$collect = [];
foreach ($array as $item) {
$title = $item['title'] ?? '#'; // 防御性处理:避免空 title
$collect[$title][] = $item['data'];
}
// 步骤2:对每个分组内的 data 按 'name' 升序排序(区分大小写,字符串排序)
ksort($collect); // 先按 title 字母顺序排序外层键
foreach ($collect as $title => &$dataGroup) {
if (!empty($dataGroup)) {
$names = array_column($dataGroup, 'name');
array_multisort($names, SORT_ASC, SORT_STRING, $dataGroup);
}
}
unset($dataGroup); // 解除引用,避免意外修改
// 步骤3:重构为最终格式:[{ "title": "...", "data": [...] }, ...]
$result = [];
foreach ($collect as $title => $dataGroup) {
$result[] = [
'title' => $title,
'data' => $dataGroup
];
}
// 输出美化 JSON(供调试或 API 返回)
echo json_encode($result, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
✅ 关键要点说明:
-
array_column($dataGroup, 'name')提取所有name值用于排序依据; -
array_multisort(..., SORT_STRING)确保按字典序正确排序(如"Aesethetica"在"Astonos"前); -
ksort($collect)保证最终结果中title(如"A"、"B")按字母升序排列; - 使用
?? '#'和空值检查提升代码健壮性,适配真实场景中的异常数据; - 若需忽略大小写排序,可将
array_column改为array_map('strtolower', array_column(...))。
该方案简洁清晰、无第三方依赖,适用于 PHP 7.0+,兼顾可读性与实用性,可直接集成至 Laravel、Symfony 或原生项目的数据组装层。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











