Laravel中实现两个数组对应元素求和的问题求助
解决Laravel中两个数组对应元素求和问题
方法一:直接数组操作
你的查询结果转成数组后,都是包含单个子数组的一维结构,先提取子数组再遍历键求和:
// 提取两个数组中的数据子数组 $dairyData = $milksalefordairy[0]; $customerData = $milksaleforcustomer[0]; $totalSales = []; // 遍历每个键,将字符串数值转为浮点数后求和 foreach ($dairyData as $key => $value) { $sum = (float)$value + (float)$customerData[$key]; // 保留两位小数,匹配期望格式 $totalSales[$key] = number_format($sum, 2); }
最终$totalSales的结构会和原数组一致,结果为:
[ "totalbmilk" => "176.00", "totala2milk" => "5.50", "totaljmilk" => "392.50" ]
方法二:利用Laravel集合(更优雅)
无需转数组,直接使用查询返回的Collection对象操作,代码更简洁:
// 用first()直接获取单个结果模型,无需get()再取索引 $dairySales = Dairymilksale::selectRaw(' SUM(buffalomilk) as totalbmilk, SUM(a2milk) as totala2milk, SUM(jerseymilk) as totaljmilk ') ->whereBetween('saledate', [$startdateofmonth, $enddateofmonth]) ->first(); $customerSales = Customermilksale::selectRaw(' SUM(buffalomilk) as totalbmilk, SUM(a2milk) as totala2milk, SUM(jerseymilk) as totaljmilk ') ->whereBetween('saledate', [$startdateofmonth, $enddateofmonth]) ->first(); // 集合的map方法遍历每个键值对求和 $totalSales = $dairySales->map(function ($value, $key) use ($customerSales) { $sum = (float)$value + (float)$customerSales->$key; return number_format($sum, 2); }); // 如需转数组,执行 $totalSales->toArray();
方法三:使用PHP原生array_map函数
如果习惯用原生数组函数,可快速实现求和:
$dairyData = $milksalefordairy[0]; $customerData = $milksaleforcustomer[0]; $totalSales = array_map(function($a, $b) { return number_format((float)$a + (float)$b, 2); }, $dairyData, $customerData);
关键注意事项
- 数据库返回的SUM结果是字符串类型,必须转为
float再相加,否则会出现字符串拼接错误(比如"168.00"+"8.00"会变成"168.008.00") number_format用于保证结果保留两位小数,若不需要格式化,直接返回求和后的浮点数即可
内容的提问来源于stack exchange,提问作者Rahul W
相关产品推荐
相关产品推荐

