2009-09-30 146 views
82

如何添加密钥的所有值[gozhi]?请注意,[gozhi]关键是动态相同密钥的总数列值

输入数组:

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 
) 
+0

对于常见情况,两个多维数组不具有完全相同的密钥。 [合并/总和多维数组php](https://stackoverflow.com/q/44607229/6521116) – 2017-06-17 17:58:42

回答

74
$sumArray = array(); 

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

print_r($sumArray); 
+36

这将会导致第一次迭代的通知,因为这些键还不存在。 – Gumbo 2009-09-30 08:26:01

+0

如果有n个数组? – 2014-04-16 13:51:45

+2

@RanaMuhammadUsman:如果有'n'阵列,请使用[此解决方案](http://stackoverflow.com/a/9938193/1438393)。 – 2014-05-11 06:08:50

11
$newarr=array(); 
foreach($arrs as $value) 
{ 
    foreach($value as $key=>$secondValue) 
    { 
     if(!isset($newarr[$key])) 
     { 
      $newarr[$key]=0; 
     } 
     $newarr[$key]+=$secondValue; 
    } 
} 
+2

请注意,每次访问右侧的$ newarr [$ key]时,这会给你PHP通知(未定义索引)当这些值不存在时,您的任务的一面。 – 2009-09-30 08:07:22

+0

我想添加一个支票来初始化$ newarr [$ key] – Graviton 2009-09-30 08:08:00

+4

什么?我被拒绝了?是什么原因? – Graviton 2009-09-30 08:26:46

25

这里是类似于其他两个中的溶液:

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

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

+0

+1这个特定数组结构的非常聪明的解决方案。太糟糕了,它不适用于所有结构类似于最终结果的更一般的数组。 – 2012-02-19 13:37:50

5

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

$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); 
    } 

} 

我想最好的浓汤的,引力的结合起来,与克里斯·J的目标如下答案,所以我可以用这个在我的应用程序:

一)初始化之外“和”数组键循环(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); 
18

它也可以用做array_map:使用array_walk

$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()); 
} 
+1

适合n个数组使用 – 2014-03-25 06:29:27

+1

如何改变N数组的数量? – Pathros 2015-04-09 19:36:08

+0

@Pathros查看更新的答案 – sanmai 2017-06-13 07:48:08

4

它也可以做到:

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')); 

并非如此可读像以前的解决方案,但它的工作原理:)

3

下面是一个版本,其中数组键可能不同于这两个数组,但是y你希望他们都能在最后阵容中出现。

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; 
} 
120

您可以使用array_walk_recursive()得到您的问题一般情况下的解决方案(一当每个阵列内都不可能有唯一键)。

$final = array(); 

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

Example with array_walk_recursive() for the general case

而且,由于PHP 5.5可以使用array_column()功能来达到你想要的确切键结果,[gozhi],例如:

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

Example with array_column() for the specified key

如果你想得到所有内部数组的总数相同的键(你想要的结果,你已发布),你可以做这样的事情(记住第一个内部数组必须有相同的结构,其他):

$final = array_shift($input); 

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

unset($value); 

Example with array_column() in case all inner arrays have the same keys

如果你想使用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); 

Example with array_column() for the general case

+6

这是最好的答案。 ☺ – Pathros 2015-02-24 17:05:19

+2

这应该是选定的答案。 – 2015-05-30 07:17:54

+1

这是一个很棒的技巧,感谢分享 – trevorgk 2015-10-17 07:23:46

0

对于那些谁落在这里,并正在寻找该合并ň阵列,也是一个解决方案总结在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 <[email protected]> 
* @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; 

} 

?> 
1

你可以试试这个:

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

最后:

print_r($c); 
0

在这里,您有怎样我平时做这样的操作。

// 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); 
+0

请你给这个代码的解释,以及它为什么回答这个问题?没有任何解释,它会比倾销代码块更有帮助。当然是 – trincot 2015-11-20 11:38:45

+0

!!对不起,我是西班牙人,对我来说,解释代码是我回答问题时最难的事!感谢您的建议@trincot – 2015-11-20 11:43:11

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

请将解释添加到您的代码片段中。 – styopdev 2016-12-30 08:31:50

0
$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); 

` 
+0

请复习[如何写出一个好答案](https://stackoverflow.com/help/how-to-answer)。不接受代码的答案是不鼓励的,因为他们没有解释他们如何解决问题中的问题。你应该更新你的答案,以解释这是什么以及它如何改善这个8岁的问题已经有的许多积极的答案。 – FluffyKitten 2017-10-12 21:24:33

0

这个工作对我laravel项目

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 
1

我们首先需要检查,如果数组键确实存在很大的。

CODE:

$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 
) 

虽然它打印输出,但这是一个不好的做法。如果钥匙确实存在,请务必先检查。

相关问题