[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Сумма элементов многомерного массива
balambasik
Всем доброго дня. Нужна помощь.
Есть такой массив
Array
(
[0] => Array
(
[a] => 5
[b] => 15
[c] => 7
...
[x] => 8
)

[1] => Array
(
[a] => 8
[b] => 140
[c] => 64
...
[x] => 87
)

[2] => Array
(
[a] => 456
[b] => 56
[c] => 3
...
[x] => 46
)

)

Нужно посчитать сумму всех элементов и на выходе получить один массив.
Array
(
[a] => сума всех "a"
[b] => сума всех "b"
[c] => сума всех "c"
...
[x] => сума всех "x"
)

Не могу придумать алгоритм действий.



balambasik
В общем вот решение. Может не самое лучшее, но работает.
	
for($i = 0; $i < count($arr); $i++)
{
$keys = array_keys($arr[$i]);

for($u = 0; $u < count($arr[$i]); $u++)
{
$out[$keys[$u]] += $arr[$i][$keys[$u]];
}
}

arbuzmaster

<?php
$arrays=array(array(1,3,5),array(3,4,5,6), array(2,4));
$sumArray=array();
foreach ($arrays as $key => $array)
{

$sumArray[$key]=array_sum($array);
}
print_r($sumArray);


Array
(
[0] => 9
[1] => 18
[2] => 6
)


_____________
Мой первый сайтик

Посмотри на свой XBMC под другим углом
T1grOK
arbuzmaster
И это...неправильный ответ)

Цель сгруппировать по ключам, с чем автор в общем то успешно справился. Единственное, во избежание "нотисов", не помешала бы проверка на существование ключей массива.

_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
Valick
Цитата (T1grOK @ 18.02.2017 - 08:42)
Единственное, во избежание "нотисов", не помешала бы проверка на существование ключей массива

Мы работаем с заведомо существующим ключом, поэтому нотисов не видать как собственных ушей. А вот чего бы действительно тут не помешало, так это рекурсии, которая будет работать с любым уровнем вложенности.

_____________
Стимулятор ~yoomoney - 41001303250491
T1grOK
Цитата (Valick @ 18.02.2017 - 06:39)
Мы работаем с заведомо существующим ключом

И где для $out это "заведомо"?


_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
Kusss
Грубо конечно
	$sum = sum_array_multi($array);
print_r($sum);


function sum_array_multi($array, $sum = []){
foreach($array as $key=>$value) {
if (is_array($value))
$sum = sum_array_multi($value, $sum);
else
$sum[$key] += (int)$value;
}
return $sum;
}
Invis1ble
Цитата (T1grOK @ 18.02.2017 - 09:42)
Единственное, во избежание "нотисов", не помешала бы проверка на существование ключей массива.

Еще вычисление count() на каждой итерации неплохо было бы убрать.

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

Another Reality
$out = [];

foreach ($arr as $index => $item) {
foreach ($item as $i => $it) {
$out[$i] += $it;
}
}
Kusss
Another Reality
Работает, но не универсально.Заточено только под определенную структуру массива.
А если массив будет примерно такой ?
$array = [
'a' => 1,
'b' => 2,
'c' => 5,
'a1' => [
'a' => 1,
'b' => 2,
'c' => 5,
],

'a2' => [
'a' => 1,
'b' => 2,
'c' => 5,
'd' => 10,
'b1' => [
'a' => 1,
'b' => 2,
'c' => 5,
'f' => 100,
],

'b2' => [
'a' => 1,
'b' => 2,
'c' => 5,
'c1' => [
'a' => 1,
'b' => 2,
'c' => 5,
'f' => 100,
],
],
],
];
Another Reality
Цитата (Kusss @ 18.02.2017 - 10:57)
Another Reality
Работает, но не универсально.Заточено только под определенную структуру массива.
А если массив будет примерно такой ?
$array = [
'a' => 1,
'b' => 2,
'c' => 5,
'a1' => [
  'a' => 1,
  'b' => 2,
  'c' => 5,
],
...
];

Так и вопрос был с известной глубиной вложенности. А если так, то будет примерно как в твоем предыдущем посте :)
Invis1ble
Ладно, уговорили. Тоже вы*бнусь :lol:

$sum = array_reduce(array_slice($arr, 1, null, true), function (array $accumulator, array $current) {
array_walk($accumulator, function (& $value, $key) use ($current) {
$value += $current[$key];
});

return $accumulator;
}, current($arr));


Решение так себе. Чисто для разнообразия, на продакшене я б не стал его юзать.

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

arbuzmaster
Цитата (T1grOK @ 18.02.2017 - 09:42)
arbuzmaster
И это...неправильный ответ)

Цель сгруппировать по ключам, с чем автор в общем то успешно справился. Единственное, во избежание "нотисов", не помешала бы проверка на существование ключей массива.

Извиняюсь был невнимателен ! Да действительно нужна сумма ключей разных массивов, а не всех элементов одного массива. rolleyes.gif

_____________
Мой первый сайтик

Посмотри на свой XBMC под другим углом
Valick
Цитата (T1grOK @ 18.02.2017 - 10:11)
И где для $out это "заведомо"?

Да, ты прав, при первом присваивании мы еще и прочитать пытаемся. Как вариант тернарный нам в помощь. Но на счёт рекурсии я не отступлюсь smile.gif

_____________
Стимулятор ~yoomoney - 41001303250491
S.Chushkin
For, Reduce ... извращенцы.
Изучайте матчасть. array_walk_recursive() и будет вам счастье.

Вариант от ТС:
$in1 = [
[
'a'=> 5, 'b'=> 15, 'c'=> 7, 'x'=> 8],
[
'a'=> 8, 'b'=> 140, 'c'=> 64, 'x'=> 87],
[
'a'=> 456, 'b'=> 56, 'c'=> 3, 'x'=> 46],
];

//
$sum = [];
array_walk_recursive($in1, function($v, $k) use(&$sum) {
@$sum[$k] += $v;
});
//
var_dump($sum);
/*
array(4) {
["a"]=> int(469)
["b"]=> int(211)
["c"]=> int(74)
["x"]=> int(141)
}
*/



Вариант от Kusss:
$in1 = [
'a' => 1,
'b' => 2,
'c' => 5,
'a1' => ['a' => 1, 'b' => 2, 'c' => 5,],
'a2' =>[
'a' => 1,
'b' => 2,
'c' => 5,
'd' => 10,
'b1' => ['a' => 1,'b' => 2,'c' => 5,'f' => 100,],
'b2' => ['a' => 1,'b' => 2,'c' => 5, 'c1' => ['a' => 1,'b' => 2,'c' => 5,'f' => 100,], ], ],
];

//
$sum = [];
array_walk_recursive($in1, function($v, $k) use(&$sum) {
@$sum[$k] += $v;
});
//
var_dump($sum);
/*
array(5) {
["a"]=> int(6)
["b"]=> int(12)
["c"]=> int(30)
["d"]=> int(10)
["f"]=> int(200)
}
*/



_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.