Значение операции для нескольких массивов, имеющих один и тот же ключ

У меня есть массив массивов

array(4) { [0]=> array(3) { ["a"]=>float(1000) ["b"]=>float(3) ["c"]=>float(500) } [1]=> array(3) { ["a"]=>float(1000) ["b"]=>float(852) ["c"]=>float(500) } [2]=> array(3) { ["a"]=>float(1000) ["b"]=>float(5) ["c"]=>float(500) } [3]=> array(1) { ["e"]=>float(1000) } } 

Результат будет суммировать все значения, которые имеют одни и те же ключи, поэтому результат должен быть:

 $result = array( "a" =>3000, "b"=>900, "c"=>1500, "e"=>1000 ) 

Любой может помочь мне это сделать.

Благодарю.

Solutions Collecting From Web of "Значение операции для нескольких массивов, имеющих один и тот же ключ"

Псевдо :

 result <- new array # array holding result foreach entry1 in array: # iterate outer array foreach entry2 in entry1: # iterate each inner array if not exists result[entry2.key]: # if key is not already in result... result[entry2.key] = 0 # ... add key and set value to zero result[entry2.key] += value # increment result for key with value from inner array 

(Я оставлю реализацию как упражнение для OP.)

Трюк для этого – это, конечно, сделать некоторую итерацию по вашим данным, используя эти строковые ключи в качестве идентификаторов. Один из способов его приближения – использовать 2 вложенных foreach (один над контейнером, один над отдельными ключами и сбор данных в центральном массиве:

 $results = array(); foreach ($array as $elements) { foreach ($elements as $key => $value) { if (!isset($results[$key])) $results[$key] = 0; $results[$key] += $value; } } 

Другой способ – это PHP-итерация для вас:

 $results = array(); array_walk_recursive( $array, function($value, $key) use (&$results) { if (!isset($results[$key])) $results[$key] = 0; $results[$key] += $value; } ); 

Эта небольшая функция выполнит эту работу для вас.

 function SummarizeFosArray($array) { $results=array(); foreach ($array as $a) { foreach ($a as $k=>$v) { $results[$k]+=$v; } } return $results; } 

Ваш код

 $array = array( array('a' => 1000, 'b' =>3, 'c'=> 500), array('a' => 1000, 'b' =>852, 'c'=> 500), array('a' => 1000, 'b' =>5, 'c'=> 500), array('e' => 1000) ); $result = array(); foreach($array as $arr) { foreach($arr as $a => $val){ $result[$a] += $val; } } echo "<pre>"; print_r($result); echo "</pre>"; 

Ваш результат

 Array ( [a] => 3000 [b] => 860 [c] => 1500 [e] => 1000 ) 

используйте array_walk_recursive() . ознакомьтесь с руководством по PHP за подробностями.