如何求多维数组中所有列值的和?

如何通过关联键添加所有的柱状值? 请注意,键集是动态的。

输入数组:

Array
(
[0] => Array
(
[gozhi] => 2
[uzorong] => 1
[ngangla] => 4
[langthel] => 5
)


[1] => Array
(
[gozhi] => 5
[uzorong] => 0
[ngangla] => 3
[langthel] => 2
)


[2] => Array
(
[gozhi] => 3
[uzorong] => 0
[ngangla] => 1
[langthel] => 3
)
)

预期结果:

Array
(
[gozhi] => 10
[uzorong] => 1
[ngangla] => 8
[langthel] => 10
)
280418 次浏览
$newarr=array();
foreach($arrs as $value)
{
foreach($value as $key=>$secondValue)
{
if(!isset($newarr[$key]))
{
$newarr[$key]=0;
}
$newarr[$key]+=$secondValue;
}
}
$sumArray = array();


foreach ($myArray as $k=>$subArray) {
foreach ($subArray as $id=>$value) {
$sumArray[$id]+=$value;
}
}


print_r($sumArray);

这里有一个与其他两个类似的解决方案:

$acc = array_shift($arr);
foreach ($arr as $val) {
foreach ($val as $key => $val) {
$acc[$key] += $val;
}
}

但是这不需要检查数组键是否已经存在,也不会抛出通知。

另一个版本,有一些好处如下。

$sum = ArrayHelper::copyKeys($arr[0]);


foreach ($arr as $item) {
ArrayHelper::addArrays($sum, $item);
}




class ArrayHelper {


public function addArrays(Array &$to, Array $from) {
foreach ($from as $key=>$value) {
$to[$key] += $value;
}
}


public function copyKeys(Array $from, $init=0) {
return array_fill_keys(array_keys($from), $init);
}


}

我想把 Gumbo’s、 Graviton’s 和 Chris J 的最佳答案与以下目标结合起来,这样我就可以在我的应用程序中使用它们:

A)在循环外初始化“ sum”数组键(Gumbo)。应该有助于提高非常大的数组的性能(尚未测试!).消除通知。

B)主要的逻辑是很容易理解的,不需要打击手册。(引力王,克里斯 J)。

C)解决更一般的问题,即添加任意两个具有相同键的数组的值,并减少它对子数组结构的依赖性。

与 Gumbo 的解决方案不同,您可以在值不在子数组中的情况下重用它。假设在下面的示例中,$arr1$arr2不是硬编码的,而是作为在循环中调用函数的结果返回的。

$arr1 = array(
'gozhi' => 2,
'uzorong' => 1,
'ngangla' => 4,
'langthel' => 5
);


$arr2 = array(
'gozhi' => 5,
'uzorong' => 0,
'ngangla' => 3,
'langthel' => 2
);


$sum = ArrayHelper::copyKeys($arr1);


ArrayHelper::addArrays($sum, $arr1);
ArrayHelper::addArrays($sum, $arr2);

也可以使用 array_map:

$rArray = array(
0 => array(
'gozhi' => 2,
'uzorong' => 1,
'ngangla' => 4,
'langthel' => 5
),
1 => array(
'gozhi' => 5,
'uzorong' => 0,
'ngangla' => 3,
'langthel' => 2
),
2 => array(
'gozhi' => 3,
'uzorong' => 0,
'ngangla' => 1,
'langthel' => 3
),
);


$sumResult = call_user_func_array('array_map', array_merge(['sum'], $rArray));


function sum()
{
return array_sum(func_get_args());
}

也可以使用 array_walk:

function array_sum_values(array $input, $key) {
$sum = 0;
array_walk($input, function($item, $index, $params) {
if (!empty($item[$params[1]]))
$params[0] += $item[$params[1]];
}, array(&$sum, $key)
);
return $sum;
}


var_dump(array_sum_values($arr, 'gozhi'));

不像以前的解决方案那样具有可读性,但是很有效:)

这个版本的数组键对于两个数组可能不相同,但是您希望它们都出现在最终的数组中。

function array_add_by_key( $array1, $array2 ) {
foreach ( $array2 as $k => $a ) {
if ( array_key_exists( $k, $array1 ) ) {
$array1[$k] += $a;
} else {
$array1[$k] = $a;
}
}
return $array1;
}

您可以使用 强 > array_walk_recursive()来获得问题的通用解决方案(每个内部数组都可能有唯一的键)。

$final = array();


array_walk_recursive($input, function($item, $key) use (&$final){
$final[$key] = isset($final[$key]) ?  $item + $final[$key] : $item;
});

一般情况下使用 array_walk_recursive()的示例

另外,由于 PHP 5.5你可以使用 强 > array_column()函数来实现你想要的 准确的钥匙[gozhi]的结果,例如:

array_sum(array_column($input, 'gozhi'));

使用指定键的 array_column()示例

如果您想得到具有相同键(你发布的期望结果)的所有内部数组的总和,您可以这样做(记住第一个内部数组必须具有与其他数组相同的结构) :

$final = array_shift($input);


foreach ($final as $key => &$value){
$value += array_sum(array_column($input, $key));
}


unset($value);

例如,如果所有内部数组都具有相同的键,则使用 array_column()

如果你想要一个使用 强 > array_column()的一般情况下的解决方案,那么首先你可以考虑得到所有唯一的键,然后得到每个键的和:

$final = array();


foreach($input as $value)
$final = array_merge($final, $value);


foreach($final as $key => &$value)
$value = array_sum(array_column($input, $key));


unset($value);

一般情况下使用 array_column()的示例

对于那些在这里着陆并正在寻找合并 N 个数组的解决方案的人,并且对 N 个数组中找到的相同键的值进行求和,我已经编写了这个递归工作的函数。(见: https://gist.github.com/Nickology/f700e319cbafab5eaedc)

例如:

$a = array( "A" => "bob", "sum" => 10, "C" => array("x","y","z" => 50) );
$b = array( "A" => "max", "sum" => 12, "C" => array("x","y","z" => 45) );
$c = array( "A" => "tom", "sum" =>  8, "C" => array("x","y","z" => 50, "w" => 1) );


print_r(array_merge_recursive_numeric($a,$b,$c));

将导致:

Array
(
[A] => tom
[sum] => 30
[C] => Array
(
[0] => x
[1] => y
[z] => 145
[w] => 1
)


)

密码是这样的:

<?php
/**
* array_merge_recursive_numeric function.  Merges N arrays into one array AND sums the values of identical keys.
* WARNING: If keys have values of different types, the latter values replace the previous ones.
*
* Source: https://gist.github.com/Nickology/f700e319cbafab5eaedc
* @params N arrays (all parameters must be arrays)
* @author Nick Jouannem <nick@nickology.com>
* @access public
* @return void
*/
function array_merge_recursive_numeric() {


// Gather all arrays
$arrays = func_get_args();


// If there's only one array, it's already merged
if (count($arrays)==1) {
return $arrays[0];
}


// Remove any items in $arrays that are NOT arrays
foreach($arrays as $key => $array) {
if (!is_array($array)) {
unset($arrays[$key]);
}
}


// We start by setting the first array as our final array.
// We will merge all other arrays with this one.
$final = array_shift($arrays);


foreach($arrays as $b) {


foreach($final as $key => $value) {


// If $key does not exist in $b, then it is unique and can be safely merged
if (!isset($b[$key])) {


$final[$key] = $value;


} else {


// If $key is present in $b, then we need to merge and sum numeric values in both
if ( is_numeric($value) && is_numeric($b[$key]) ) {
// If both values for these keys are numeric, we sum them
$final[$key] = $value + $b[$key];
} else if (is_array($value) && is_array($b[$key])) {
// If both values are arrays, we recursively call ourself
$final[$key] = array_merge_recursive_numeric($value, $b[$key]);
} else {
// If both keys exist but differ in type, then we cannot merge them.
// In this scenario, we will $b's value for $key is used
$final[$key] = $b[$key];
}


}


}


// Finally, we need to merge any keys that exist only in $b
foreach($b as $key => $value) {
if (!isset($final[$key])) {
$final[$key] = $value;
}
}


}


return $final;


}


?>

你可以试试这个:

$c = array_map(function () {
return array_sum(func_get_args());
},$a, $b);

最后:

print_r($c);

这是我通常做这种手术的方式。

// We declare an empty array in wich we will store the results
$sumArray = array();


// We loop through all the key-value pairs in $myArray
foreach ($myArray as $k=>$subArray) {


// Each value is an array, we loop through it
foreach ($subArray as $id=>$value) {


// If $sumArray has not $id as key we initialize it to zero
if(!isset($sumArray[$id])){
$sumArray[$id] = 0;
}


// If the array already has a key named $id, we increment its value
$sumArray[$id]+=$value;
}
}


print_r($sumArray);
$sumArray = array();
foreach ($myArray as $k => $subArray) {
foreach ($subArray as $id => $value) {
if (!isset($sumArray[$id])) {
$sumArray[$id] = 0;
}
$sumArray[$id]+=$value;
}
}
$sumArray = array();


foreach ($myArray as $k=>$subArray) {
foreach ($subArray as $id=>$value) {
if(!isset($sumArray[$id])){
$sumArray[$id] =$value;
}else {
$sumArray[$id]+=$value;
}
}
}


print_r($sumArray);


`

这对我的幼虫项目很有帮助

print_r($Array); // your original array


$_SUM = [];


// count($Array[0]) => if the number of keys are equall in all arrays then do a count of index 0 etc.
for ($i=0; $i < count($Array[0]); $i++) {
$_SUM[] = $Array[0][$i] + $Array[1][$i]; // do a for loop on the count
}


print_r($_SUM); // get a sumed up array

我们首先需要检查数组键是否存在。

密码:

$sum = array();
foreach ($array as $key => $sub_array) {
foreach ($sub_array as $sub_key => $value) {


//If array key doesn't exists then create and initize first before we add a value.
//Without this we will have an Undefined index error.
if( ! array_key_exists($sub_key, $sum)) $sum[$sub_key] = 0;


//Add Value
$sum[$sub_key]+=$value;
}
}
print_r($sum);

输出数组密钥验证:

Array
(
[gozhi] => 10
[uzorong] => 1
[ngangla] => 8
[langthel] => 10
)

没有数组密钥验证的输出:

Notice: Undefined index: gozhi in F:\web\index.php on line 37


Notice: Undefined index: uzorong in F:\web\index.php on line 37


Notice: Undefined index: ngangla in F:\web\index.php on line 37


Notice: Undefined index: langthel in F:\web\index.php on line 37


Array
(
[gozhi] => 10
[uzorong] => 1
[ngangla] => 8
[langthel] => 10
)

这是一个不好的做法,尽管它打印输出。总是首先检查键是否存在。

使用以下代码片段:

$key = 'gozhi';
$sum = array_sum(array_column($array,$key));

例如,您可以从下面这样的结果中提取所有字段。

我从一个数组中选出“余额”,然后保存到一个变量中

$kii =   $user->pluck('balance');

然后在下一行你可以这样求和:

$sum =  $kii->sum();

希望能有帮助。

遍历数组中的每个项目,如果存在,则将值和为以前的值,如果不仅仅是赋值的话。

<?php
$array =
[
[
'a'=>1,
'b'=>1,
'c'=>1,
],
[
'a'=>2,
'b'=>2,
],
[
'a'=>3,
'd'=>3,
]
];


$result = array_reduce($array, function($carry, $item) {
foreach($item as $k => $v)
$carry[$k] = $v + ($carry[$k] ?? 0);


return $carry;
}, []);


print_r($result);

产出:

Array
(
[a] => 6
[b] => 3
[c] => 1
[d] => 3
)

或者只是循环遍历每个子数组,然后对每个列的值进行分组,最后将它们相加:

foreach($array as $subarray)
foreach($subarray as $key => $value)
$grouped[$key][] = $value;


$sums = array_map('array_sum', $grouped);

example array here

这里的代码:

        $temp_arr = [];
foreach ($a as $k => $v) {
if(!is_null($v)) {
$sum = isset($temp_arr[$v[0]]) ? ((int)$v[5] + $sum) : (int)$v[5];
$temp_arr[$v[0]] = $sum;
}
}
return $temp_arr;

结果:

{SEQ_OK: 1328,SEQ_ERROR: 561}

Array _ reduce ()的简单示例

$numbers = [10,20,30];


$total = 0;


foreach ($numbers as $number) {
$total += $number;
}


echo $total; // 60

= >

$numbers = [10,20,30];


$total  = array_reduce($numbers, function ($previous, $current) {
return $previous + $current;
});


echo $total; // 60

使用 assoc 数组:

$carts = [
['item' => 'A', 'qty' => 2, 'price' => 10],
['item' => 'B', 'qty' => 3, 'price' => 20],
['item' => 'C', 'qty' => 5, 'price' => 30]
];




$total = array_reduce(
$carts,
function ($prev, $item) {
return $prev + $item['qty'] * $item['price'];
}
);


echo $total; // 155

更多信息 = > https://www.phptutorial.net/php-tutorial/php-array_reduce/