求下列多维数组中 mp的总和 和 total 的总和,放到新的数组中
$arr = [
0 => [
"id" => 2
"bjyf" => "2023-03"
"create_time" => "2023-04"
"sn" => "WC230327CS0001"
"ssn" => "2"
"report_status_name" => "检测中"
"report_sn" => null
"sbpz" => "曳引驱动载货电梯"
"sblb" => "曳引与强制驱动电梯"
"nature" => "定期检测"
"role" => "主检"
"total" => 10
"mp" => "20"
],
1 => [
"id" => 2
"bjyf" => "2023-03"
"create_time" => "2023-04"
"sn" => "WC230327CS0001"
"ssn" => "2"
"report_status_name" => "检测中"
"report_sn" => null
"sbpz" => "曳引驱动载货电梯"
"sblb" => "曳引与强制驱动电梯"
"nature" => "定期检测"
"role" => "主检"
"total" => 1230
"mp" => "80"
],
2 => [
"id" => 2
"bjyf" => "2023-03"
"create_time" => "2023-04"
"sn" => "WC230327CS0001"
"ssn" => "2"
"report_status_name" => "检测中"
"report_sn" => null
"sbpz" => "曳引驱动载货电梯"
"sblb" => "曳引与强制驱动电梯"
"nature" => "定期检测"
"role" => "主检"
"total" => 98760
"mp" => "1230"
]
]
方式1:
使用foreach循环来遍历数组,并使用一个新的数组来存储求和结果。具体实现:
function sumArray($arr) {
$result = array("mp_sum" => 0, "total_sum" => 0); // 初始化结果数组
foreach ($arr as $item) {
$result['mp_sum'] += intval($item['mp']); // 求mp的总和
$result['total_sum'] += intval($item['total']); // 求total的总和
}
return $result;
}
输出结果为:
Array
(
[mp_sum] => 1330
[total_sum] => 98800
)
方式2:
使用array_reduce函数,通过回调函数累加,具体实现:
// 定义回调函数
$sumCallback = function ($carry, $item) {
$carry['mp_sum'] += intval($item['mp']); // 求mp的总和
$carry['total_sum'] += intval($item['total']); // 求total的总和
return $carry; // 返回累加结果
};
//使用方式
$result = array_reduce($arr, $sumCallback, array("mp_sum" => 0, "total_sum" => 0)); // 初始化累加器为结果数组
输出结果和之前的实现一样:
Array
(
[mp_sum] => 1330
[total_sum] => 98800
)
方式3:
使用array_column、array_sum和array_reduce三个函数结合实现累加
$mp_sum = array_sum(array_column($arr, 'mp')); // 求mp的总和
$total_sum = array_sum(array_column($arr, 'total')); // 求total的总和
$result = array("mp_sum" => $mp_sum, "total_sum" => $total_sum); // 初始化结果数组
print_r($result); // 输出结果
输出结果和之前的实现一样:
Array
(
[mp_sum] => 1330
[total_sum] => 98800
)
因为数据量小,这3中方法的运算效率都差不多
但是实际上,使用array_reduce函数的效率是要高于使用foreach循环和array_sum函数的效率的。这是因为array_reduce函数使用了内置的C语言编写的底层优化,避免了PHP解释器中间的环节,从而提高了执行效率。
在处理大量数据时,应该优先考虑使用array_reduce函数来实现累加操作。
对于小量数据的处理,三种方法之间的效率差别微不足道,在实际使用中可以根据自己的习惯和实际情况选择更加适合自己的方法。