
本文介绍如何在 php 中基于关联数组的某一公共键(如 `kp_uid`)对数据进行分组,并将同组内另一字段(如 `full_name`)的值合并为单个逗号分隔字符串,最终生成结构精简、语义清晰的新数组。
在实际开发中,常需对多维关联数组按某个维度(如用户 ID、分类标识等)进行逻辑聚合。例如,原始数据中多个记录共享相同的 kp_uid,但各自携带独立的 full_name;此时目标并非简单去重或求和,而是将同组姓名拼接为可读性强的字符串,便于展示或后续处理。
以下是一个简洁、高效且可复用的实现方案:
<?php
$items = [
['id' => 1000012, 'kp_uid' => 100000570, 'assigned_uid' => '<a href="mailto:tim@example.com">[email protected]</a>', 'full_name' => 'Tim Hughes'],
['id' => 1000013, 'kp_uid' => 100000570, 'assigned_uid' => '<a href="mailto:brad@example.com">[email protected]</a>', 'full_name' => 'Brad Slater'],
['id' => 1000014, 'kp_uid' => 100000570, 'assigned_uid' => '<a href="mailto:karen@example.com">[email protected]</a>', 'full_name' => 'Karen Tevis'],
['id' => 1000015, 'kp_uid' => 100000597, 'assigned_uid' => '<a href="mailto:karen2@example.com">[email protected]</a>', 'full_name' => 'Karen Tevis']
];
// 步骤 1:按 kp_uid 分组(键为 kp_uid,值为该组所有原始项)
$grouped = [];
foreach ($items as $item) {
$kpUid = $item['kp_uid'];
$grouped[$kpUid][] = $item;
}
// 步骤 2:对每个分组生成新结构:kp_uid + 合并后的 full_name 字符串
$result = [];
foreach ($grouped as $kpUid => $group) {
$names = array_column($group, 'full_name'); // 更简洁地提取 full_name 列
$result[] = [
'kp_uid' => $kpUid,
'full_name' => implode(', ', $names)
];
}
print_r($result);
?>输出结果:
Array
(
[0] => Array
(
[kp_uid] => 100000570
[full_name] => Tim Hughes, Brad Slater, Karen Tevis
)
[1] => Array
(
[kp_uid] => 100000597
[full_name] => Karen Tevis
)
)✅ 关键优化说明:
立即学习“PHP免费学习笔记(深入)”;
- 使用 array_column($group, 'full_name') 替代自定义回调函数,代码更简洁、性能更优;
- 避免嵌套 array_map 与 array_keys 的复杂组合,提升可读性与调试友好度;
- 分两步处理(先分组,再映射),逻辑清晰,易于扩展(例如后续添加去重、排序或过滤)。
⚠️ 注意事项:
- 若需去除重复姓名,可在 implode 前添加 array_unique($names);
- 若原始数据中 kp_uid 可能为 null 或非标量类型,请先做类型校验或强制转换(如 (string)$item['kp_uid']);
- array_column() 在 PHP ≥ 5.5.0 中可用;低版本可改用 array_map(fn($x) => $x['full_name'], $group)(PHP 7.4+)或传统 foreach 提取。
该方法兼顾健壮性与可维护性,适用于报表汇总、权限聚合、多对一关系扁平化等典型业务场景。











