
本文介绍如何在 php 中基于关联数组的某个键(如 `kp_uid`)对数据进行分组,并将每组中另一字段(如 `full_name`)的值合并为单一逗号分隔字符串,适用于报表聚合、去重汇总等典型业务场景。
在实际开发中,常需对多条结构化记录按某一维度(如用户 ID、部门编号、状态码)归类,并将同组内特定字段聚合为可读性更强的格式——例如将多名员工姓名拼接为“张三, 李四, 王五”。本教程提供一种简洁、高效且可复用的 PHP 实现方案,无需依赖外部库,仅使用原生数组函数即可完成。
核心思路:两步聚合法
- 按目标键分组:遍历原始数组,以 kp_uid 为键构建嵌套数组,使相同 kp_uid 的所有记录归入同一子数组;
- 映射并拼接值:对每个分组调用 array_map() 提取 full_name,再用 implode(', ', ...) 合并为字符串,最终构造标准化输出结构。
以下是完整可运行示例代码:
<?php
$items = [
['id' => 1000012, 'kp_uid' => 100000570, 'assigned_uid' => '<a data-cfemail="...">[email protected]</a>', 'full_name' => 'Tim Hughes'],
['id' => 1000013, 'kp_uid' => 100000570, 'assigned_uid' => '<a data-cfemail="...">[email protected]</a>', 'full_name' => 'Brad Slater'],
['id' => 1000014, 'kp_uid' => 100000570, 'assigned_uid' => '<a data-cfemail="...">[email protected]</a>', 'full_name' => 'Karen Tevis'],
['id' => 1000015, 'kp_uid' => 100000597, 'assigned_uid' => '<a data-cfemail="...">[email protected]</a>', 'full_name' => 'Karen Tevis'],
];
// 步骤 1:按 kp_uid 分组
$grouped = [];
foreach ($items as $item) {
$kpUid = $item['kp_uid'];
$grouped[$kpUid][] = $item;
}
// 步骤 2:生成最终结果数组
$result = [];
foreach ($grouped as $kpUid => $group) {
$names = array_column($group, 'full_name'); // 更简洁替代 array_map + 回调
$result[] = [
'kp_uid' => $kpUid,
'full_name' => implode(', ', $names)
];
}
// 输出结果(JSON 格式便于验证)
echo json_encode($result, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
?>输出结果:
[
{
"kp_uid": 100000570,
"full_name": "Tim Hughes, Brad Slater, Karen Tevis"
},
{
"kp_uid": 100000597,
"full_name": "Karen Tevis"
}
]关键优化说明
- ✅ 使用 array_column($group, 'full_name') 替代自定义回调函数,语义更清晰、性能更优;
- ✅ 避免 array_map() 与 array_keys() 的双重遍历,改用传统 foreach 提升可读性与调试友好性;
- ✅ 保留原始 kp_uid 类型(整型),避免隐式类型转换导致的键冲突(如 '100000570' 字符串 vs 100000570 整数);
- ⚠️ 注意:若原始数据中存在 kp_uid 为空或非标量值,建议提前过滤(如 is_scalar($item['kp_uid']) && $item['kp_uid'] !== null)。
扩展建议
- 若需去重(如同一 kp_uid 下 full_name 可能重复),可在拼接前添加 array_unique($names);
- 若需按字母序排列姓名,可追加 sort($names, SORT_STRING);
- 如需兼容 PHP
该方案兼顾健壮性、可维护性与执行效率,是处理此类“分组+字符串聚合”需求的标准实践。
立即学习“PHP免费学习笔记(深入)”;











