如何按共享id字段合并多个集合,将同id数据聚合为单个对象
实现方法
你之前使用的merge方法仅会将多个集合的元素直接拼接追加,不会按共享的id字段合并同id数据的字段,可按以下方式实现需求:
Laravel 集合实现(符合你当前的代码风格)
$result = $names->concat($ages)->concat($address) ->groupBy('id') ->map(fn ($groupItems) => collect($groupItems)->collapse()) ->values();
逻辑说明:
- 先通过
concat把三个集合的所有元素汇总到同一个集合中 - 调用
groupBy('id')将所有元素按id值分组,相同id的多条数据会被归为一组 - 对每个分组的多条数据执行
collapse合并为单条数据,重复的id字段会自动覆盖(值完全相同不影响结果) - 最后调用
values()重置集合的索引为连续数字索引,符合你预期的输出格式
原生PHP实现(不依赖集合类)
// 先把所有数组合并到一个大数组中 $allItems = array_merge($names->toArray(), $ages->toArray(), $address->toArray()); $temp = []; foreach ($allItems as $item) { $id = $item['id']; if (!isset($temp[$id])) { $temp[$id] = []; } $temp[$id] = array_merge($temp[$id], $item); } // 重置索引得到结果 $result = array_values($temp);
两种方式最终输出的结果都和你预期的格式完全一致。
内容的提问来源于stack exchange,提问作者steven
相关产品推荐
相关产品推荐

