У меня есть массив массивов
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 )
Любой может помочь мне это сделать.
Благодарю.
Псевдо :
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 за подробностями.