PHP 中按关联数组指定键分组并合并对应值为逗号分隔字符串

2次阅读

PHP 中按关联数组指定键分组并合并对应值为逗号分隔字符串

本文介绍如何在 php 中基于关联数组的某个键(如 `kp_uid`)对数据进行分组,并将每组中另一字段(如 `full_name`)的值合并为单一逗号分隔字符串,适用于报表聚合、去重汇总等典型业务场景。

在实际开发中,常需对多条结构化记录按某一维度(如用户 ID、部门编号、状态码)归类,并将同组内特定字段聚合为可读性更强的格式——例如将多名员工姓名拼接为“张三, 李四, 王五”。本教程提供一种简洁、高效且可复用的 php 实现方案,无需依赖外部库,仅使用原生数组函数即可完成。

核心思路:两步聚合法

  1. 按目标键分组:遍历原始数组,以 kp_uid 为键构建嵌套数组,使相同 kp_uid 的所有记录归入同一子数组;
  2. 映射并拼接值:对每个分组调用 array_map() 提取 full_name,再用 implode(‘, ‘, …) 合并为字符串,最终构造标准化输出结构。

以下是完整可运行示例代码:

<?php $items = [     ['id' => 1000012, 'kp_uid' => 100000570, 'assigned_uid' => '<a data-cfemail="...">[email&#160;protected]</a>', 'full_name' => 'Tim Hughes'],     ['id' => 1000013, 'kp_uid' => 100000570, 'assigned_uid' => '<a data-cfemail="...">[email&#160;protected]</a>', 'full_name' => 'Brad Slater'],     ['id' => 1000014, 'kp_uid' => 100000570, 'assigned_uid' => '<a data-cfemail="...">[email&#160;protected]</a>', 'full_name' => 'Karen Tevis'],     ['id' => 1000015, 'kp_uid' => 100000597, 'assigned_uid' => '<a data-cfemail="...">[email&#160;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免费学习笔记(深入)”;

text=ZqhQzanResources