mar*_*t15 107 php arrays sum multidimensional-array
如何通过关联键添加所有列值?请注意,__CODE__密钥是动态的.
输入数组:
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
)
)
Run Code Online (Sandbox Code Playgroud)
期望的结果:
Array
(
[gozhi] => 10
[uzorong] => 1
[ngangla] => 8
[langthel] => 10
)
Run Code Online (Sandbox Code Playgroud)
pot*_*hin 171
您可以使用array_walk_recursive()获得问题的一般案例解决方案(当每个内部数组可能具有唯一键时).
$final = array();
array_walk_recursive($input, function($item, $key) use (&$final){
$final[$key] = isset($final[$key]) ? $item + $final[$key] : $item;
});
Run Code Online (Sandbox Code Playgroud)
实施例与array_walk_recursive()对一般的情况下
此外,由于PHP 5.5,你可以使用array_column()函数来实现你想要的结果的精确关键字,[gozhi]例如:
array_sum(array_column($input, 'gozhi'));
Run Code Online (Sandbox Code Playgroud)
如果你想用相同的键(你发布的所需结果)得到所有内部数组的总和,你可以做这样的事情(记住第一个内部数组必须具有与其他数组相同的结构)):
$final = array_shift($input);
foreach ($final as $key => &$value){
$value += array_sum(array_column($input, $key));
}
unset($value);
Run Code Online (Sandbox Code Playgroud)
示例,array_column()以防所有内部数组具有相同的键
如果你想要一个使用array_column()then 的一般案例解决方案,你可以考虑获得所有唯一的密钥,然后得到每个密钥的总和:
$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);
Run Code Online (Sandbox Code Playgroud)
Chr*_*s J 85
$sumArray = array();
foreach ($myArray as $k=>$subArray) {
foreach ($subArray as $id=>$value) {
$sumArray[$id]+=$value;
}
}
print_r($sumArray);
Run Code Online (Sandbox Code Playgroud)
Gum*_*mbo 28
这是一个类似于其他两个的解决方案:
$acc = array_shift($arr);
foreach ($arr as $val) {
foreach ($val as $key => $val) {
$acc[$key] += $val;
}
}
Run Code Online (Sandbox Code Playgroud)
但是这不需要检查数组键是否已经存在并且不会抛出通知.
小智 21
它也可以使用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());
}
Run Code Online (Sandbox Code Playgroud)
小智 14
使用此代码段:
$key = 'gozhi';
$sum = array_sum(array_column($array,$key));
Run Code Online (Sandbox Code Playgroud)
Gra*_*ton 12
$newarr=array();
foreach($arrs as $value)
{
foreach($value as $key=>$secondValue)
{
if(!isset($newarr[$key]))
{
$newarr[$key]=0;
}
$newarr[$key]+=$secondValue;
}
}
Run Code Online (Sandbox Code Playgroud)
另一个版本,下面有一些好处.
$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);
}
}
Run Code Online (Sandbox Code Playgroud)
我想将Gumbo,Graviton和Chris J的最佳答案与以下目标结合起来,以便我可以在我的应用中使用它:
a)初始化循环外的'sum'数组键(Gumbo).应该有助于在非常大的阵列上进行性能测试(尚未测试!).消除通知.
b)主要逻辑易于理解而无需遵守手册.(Graviton,Chris 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);
Run Code Online (Sandbox Code Playgroud)