You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 21:57:20