
本文介绍如何将具有相同 title 字段的多个关联数组项,合并为以 title 为键、data 为同名对象数组的嵌套结构,并支持按名称字母序排序。
本文介绍如何将具有相同 `title` 字段的多个关联数组项,合并为以 `title` 为键、`data` 为同名对象数组的嵌套结构,并支持按名称字母序排序。
在实际开发中(如品牌列表按首字母分组展示),我们常需将扁平化的数据按某个字段(如 title)聚合成嵌套结构。原始数据形如:
[
{"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"}}
]目标是将其转换为每个 title 对应一个含 data 数组的对象,且 data 内部按 name 升序排列。
✅ 核心实现步骤
解析 JSON 并初始化分组容器
使用json_decode($json, true)转为 PHP 关联数组;用$collect以title为键累积data子项。按 title 分组数据
遍历原数组,将每个$item['data']推入$collect[$item['title']],自动形成二维分组。按键排序(可选但推荐)
ksort($collect)确保最终结果中title(如 A、B、C…)按字典序排列。对每组 data 按 name 排序
利用array_column()提取所有name值,再通过array_multisort()实现稳定字符串升序排序。重构为标准输出格式
遍历$collect,构造新数组:每个元素为['title' => $title, 'data' => $sortedData]。
? 完整可运行代码示例
<?php
$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);
$collect = [];
// 步骤1 & 2:按 title 归集 data
foreach ($array as $item) {
if (isset($item['title']) && isset($item['data'])) {
$collect[$item['title']][] = $item['data'];
}
}
// 步骤3:按 title 字母序排序(A, B, C...)
ksort($collect);
// 步骤4 & 5:构建最终结构 + 组内按 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_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
?>⚠️ 注意事项
-
健壮性增强:建议在
foreach中添加isset()判断,避免因缺失title或data导致 Notice。 -
性能考量:该方案适用于中等规模数据(SplFixedArray 或数据库
GROUP BY预聚合。 -
排序稳定性:
array_multisort()在 PHP 7.4+ 中保证相等元素相对顺序不变,适合多级排序场景。 -
字符兼容性:若
title含中文、符号或数字,ksort()默认按字节排序;如需 Unicode 排序,改用uksort($collect, 'strcoll')。
✅ 最终输出效果
[
{
"title": "A",
"data": [
{
"id": "317",
"name": "Aesethetica"
},
{
"id": "318",
"name": "Astonos"
}
]
},
{
"title": "B",
"data": [
{
"id": "321",
"name": "Bioderma"
},
{
"id": "320",
"name": "Bourjois"
}
]
}
]此结构可直接用于前端 Vue/React 的分组渲染,或作为 API 响应返回,兼顾语义清晰性与前端消费友好性。
立即学习“PHP免费学习笔记(深入)”;



















