如何基于日期键值将Laravel Collection与数组合并
解决方案
你之前用merge出现重复数据,是因为Laravel集合对数字键集合执行merge时,会将后续集合的元素追加到前面,而非按date字段匹配覆盖,导致同一个日期会同时存在默认值和原数据两个条目。
正确的做法是先把原集合按date字段转为键索引,再遍历目标日期数组匹配数据:
// 将原集合转为以date为键的集合,实现快速查找 $dateMap = $collection->keyBy('date'); // 遍历dates数组,匹配数据或使用默认值 $result = collect($dates)->map(function ($date) use ($dateMap) { // 找到对应日期的数据则用原数据,否则返回默认值 return $dateMap->get($date, [ 'new' => 0, 'settled' => '0', 'date' => $date ]); }); return $result;
代码说明
keyBy('date'):将原集合转换为以date字段值为键的关联集合,通过get()方法可以实现O(1)时间复杂度的快速查找。map()遍历$dates数组:严格保持原日期顺序,对每个日期优先使用原集合中的数据,未匹配到则返回预设的默认值数组。
这样处理后,每个日期只会出现一次,匹配到的保留原数据,未匹配的用默认值,完全符合你的需求。
内容的提问来源于stack exchange,提问作者SymmetricsWeb
相关产品推荐
相关产品推荐

