[英]PHP array sum values
我有这个数组:
array(
[1] => Array
(
[1111] => Array
(
[one] => 70
[two] => 7.0
)
)
[2] => Array
(
[1111] => Array
(
[one] => 10
[two] => 2.0
)
)
)
我希望它对两个不同数组的 [one] 和 [two] 求和并输出这样的数组:
Array
(
[1111] => Array (
[one] => 80
[two] => 9.0
)
)
基于密钥“1111”
我已经尝试过以下
$array = array_values( $array );
$sum_array = [];
foreach ( $array as $k => $sub_array ) {
foreach ( $sub_array as $id => $value ) {
$sum_array[$id] += array_key_exists( $id, $sum_array ) ? $sum_array[$id] += $value : $sum_array[$id] = $value;
$sum_array[$id]['two'] += array_sum( $sum_array[$id]['two'] ) / ( 100 * count( $sum_array[$id]['count'] ) );
}
}
但这只给了我这样的第一个值:
Array
(
[1111] => Array (
[one] => 70
[two] => 7.0
)
)
有人可以告诉我我做错了什么吗?
您可以使用array_reduce
将数组减少到只有一个元素。
array_reduce
函数需要两个(有时是三个)参数。 第一个是数组,第二个是带有两个参数的回调,收集器和当前项。 如果array_reduce
函数有第三个参数,它将用于初始化收集器(就像我们的例子一样)。
该函数将解析每个项目并对其进行处理,收集器将在每次迭代时可用,这就是我们使用它来保存数据信息的原因,在我们的例子中,它是值的总和。 迭代完所有项目后,该函数将返回收集器。
<?php
$array = [
[
'1111' => [
'one' => 70,
'two' => 7.0
]
],
[
'1111' => [
'one' => 10,
'two' => 2.0
]
]
];
$output = array_reduce($array, function($collector, $item) {
$collector['1111']['one'] += $item['1111']['one'];
$collector['1111']['two'] += $item['1111']['two'];
return $collector;
}, ['1111' => ['one' => 0, 'two' => 0]]);
var_dump($output);
这是一种使用递归合并的方法。 在下面合并时约翰的小时数成为一个数组。 然后我们需要求和。 由于詹姆斯只有一个条目,他的时间不会变成数组,所以我们保留它们。
希望过渡合并输出能让你了解这个过程:
<?php
$items =
[
[
'john' => [
'hours' => 2,
'tips' => 7
]
],
[
'john' => [
'hours' => 3,
'tips' => 10
]
],
[
'james' => [
'hours' => 8,
'tips' => 0
]
]
];
$output = array_merge_recursive(...$items);
var_export($output);
array_walk($output, function(&$v) {
array_walk($v, function(&$v) {
if(is_array($v))
$v = array_sum($v);
});
});
echo "\nResult: \n";
var_export($output);
输出:
array (
'john' =>
array (
'hours' =>
array (
0 => 2,
1 => 3,
),
'tips' =>
array (
0 => 7,
1 => 10,
),
),
'james' =>
array (
'hours' => 8,
'tips' => 0,
),
)
Result:
array (
'john' =>
array (
'hours' => 5,
'tips' => 17,
),
'james' =>
array (
'hours' => 8,
'tips' => 0,
),
)
$total=0;
array_map(function ($item) use ($total)
{
$total += $item['one'] + $item['two'];
}, $array);
echo $total;
或差异键
$one = array_sum(array_column($array, 'one'));
$two = array_sum(array_column($array, 'two'));
$resultArray = compact('one','two');
```
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.