如何用PHP内置函数合并关联数组:相同field下id和value逗号分隔
用PHP内置函数实现数组合并需求
当然可以通过PHP内置函数的组合来实现这个需求!下面我给你两种简洁的实现方案,都是基于PHP原生内置函数完成的:
方案一:使用array_reduce累加合并
array_reduce非常适合这种需要遍历数组并逐步累加结果的场景,代码逻辑清晰直观:
$originalArray = [ ['id' => 10, 'field' => 'new', 'value' => 'pqr'], ['id' => 14, 'field' => 'test', 'value' => 'abc'], ['id' => 17, 'field' => 'test', 'value' => 'xyz'], ]; // 用array_reduce遍历处理原数组 $mergedArray = array_reduce($originalArray, function($carry, $item) { $fieldKey = $item['field']; if (isset($carry[$fieldKey])) { // 已存在相同field的项,拼接id和value $carry[$fieldKey]['id'] .= ',' . $item['id']; $carry[$fieldKey]['value'] .= ',' . $item['value']; } else { // 新的field项,直接存入临时数组 $carry[$fieldKey] = $item; } return $carry; }, []); // 将关联数组转换为索引数组(匹配你想要的输出格式) $mergedArray = array_values($mergedArray); print_r($mergedArray);
这段代码的核心逻辑是:以field作为临时数组的键来分组,遇到重复field时就把对应id和value用逗号拼接,最后用array_values把键名去掉,转换成纯索引数组。
方案二:先分组再合并(array_column + array_map)
这种方法先通过array_column按field分组,再用array_map处理每个分组的合并:
$originalArray = [ ['id' => 10, 'field' => 'new', 'value' => 'pqr'], ['id' => 14, 'field' => 'test', 'value' => 'abc'], ['id' => 17, 'field' => 'test', 'value' => 'xyz'], ]; // 第一步:按field字段分组 $groupedByField = array_column($originalArray, null, 'field'); // 第二步:遍历每个分组,合并id和value $mergedArray = array_map(function($groupItems) { // 处理单个元素的情况 if (!isset($groupItems[0])) { return $groupItems; } // 多个元素时,用implode拼接id和value return [ 'id' => implode(',', array_column($groupItems, 'id')), 'field' => $groupItems[0]['field'], 'value' => implode(',', array_column($groupItems, 'value')), ]; }, $groupedByField); // 转换为索引数组 $mergedArray = array_values($mergedArray); print_r($mergedArray);
这里先用array_column把原数组按field聚合成分组,再对每个分组用implode和array_column提取并拼接id、value,同样最后转成索引数组得到目标结果。
两种方案都完全依赖PHP内置函数,不需要手动写复杂的循环逻辑,运行效率和可读性都很不错。
内容的提问来源于stack exchange,提问作者Ranjan Kumar
相关产品推荐
相关产品推荐

