PHP Laravel中如何以指定列为参照跨集合累加quantity字段值
Laravel 集合匹配累加实现方案
直接用Laravel集合提供的原生方法即可实现,不需要写嵌套循环,同时能保证大数量下的执行效率,且完整保留第一个集合的原有结构与字段。
实现思路
- 先将第二个集合处理成「关联ID => 待累加数量」的键值映射,查找匹配项时直接按键读取,时间复杂度为O(1),远高于嵌套循环/每次遍历查找的效率
- 遍历第一个集合的每个元素,按id匹配映射中的待累加值,匹配到则做数值累加,未匹配到保留原数值
- 处理过程中不修改元素原有其他字段,兼容集合元素为数组/标准对象两种格式,最终输出结构和原第一个集合完全一致
可直接使用的代码
假设你持有的两个集合变量名为$firstCollection、$secondCollection(若当前是普通PHP数组,用collect(数组变量)转为Laravel集合即可):
// 生成第二个集合的reference => quantity 键值映射 $additionMap = $secondCollection->pluck('quantity', 'reference'); // 遍历处理第一个集合 $result = $firstCollection->map(function ($item) use ($additionMap) { // 兼容元素是数组/对象两种格式,不破坏原结构 $current = is_array($item) ? $item : (array)$item; $matchId = $current['id']; if ($additionMap->has($matchId)) { // 强制转数值相加避免字符串拼接bug,计算完转回字符串和原字段类型一致 $current['quantity'] = (string)( intval($current['quantity']) + intval($additionMap->get($matchId)) ); } return is_object($item) ? (object)$current : $current; });
效果说明
执行后$result就是你需要的最终结果:
- id为1的元素quantity从100累加80变为180,name字段保留
- id为2的元素quantity从200累加50变为250,codProd字段保留
- id为3的元素无匹配项,quantity保持30不变,name字段保留
和你给出的预期输出完全一致。
内容的提问来源于stack exchange,提问作者FeRcHo
相关产品推荐
相关产品推荐

