массивы сумм в PHP

Мне нужно суммировать некоторые массивы (массив массивов). Структура моих массивов такова:

Array([id]=>some_id, [name]=>some_name, [value]=>float_value)

Я знаю, что у меня есть N массивов, как и раньше. Мне нужно суммировать те, у кого одинаковый идентификатор.

Есть идеи?

Пример:
**

Array
(
    [id] => 1
    [name] => John00
    [value] => 0.9
)
Array
(
    [id] => 2
    [name] => Ann01
    [value] => 0.011
)
Array
(
    [id] => 3
    [name] => Ann
    [value] => 0.1
)

**


person Ahmed Youssef    schedule 18.06.2009    source источник


Ответы (3)


Я не совсем уверен, что вы пытаетесь сделать - я предполагаю, что вам нужна сумма, сгруппированная по идентификатору для каждого отдельного идентификатора, но я могу ошибаться.

<?php
//result array of sums
$sums = array();

//example data
$source = array(
    array('id'=>3, 'name'=>'some_name6', 'value'=>1.6),
    array('id'=>1, 'name'=>'some_name', 'value'=>1.4),
    array('id'=>1, 'name'=>'some_name2', 'value'=>7.2),
    array('id'=>2, 'name'=>'some_name3', 'value'=>4.4),
    array('id'=>1, 'name'=>'some_name4', 'value'=>1.2),
    array('id'=>2, 'name'=>'some_name5', 'value'=>1.4),
);

foreach ($source as $ar) {
    //create an entry for this id in the array of sums if does not exist.
    if (!isset($sums[ $ar['id'] ])) {
        $sums[ $ar['id'] ] = 0;
    }

    //add 'value' key to sum for that id
    $sums[ $ar['id'] ] += $ar['value'];
}

//sort by id
ksort($sums);

print_r($sums);

/* output:
Array
(
    [1] => 9.8
    [2] => 5.8
    [3] => 1.6
)
*/
person Tom Haigh    schedule 18.06.2009
comment
вы предположили правильно, но я получаю только сумму последнего идентификатора. Я думаю, что я делаю ошибку где-то. большое спасибо - person Ahmed Youssef; 18.06.2009

Похоже, это исходит из базы данных, и запрос — лучшее место для таких вещей. (если это не данные из БД, просто игнорируйте этот ответ).

SELECT id, SUM(value)
FROM YourTable
-- add your WHERE-constraints here
GROUP BY id;
person soulmerge    schedule 18.06.2009

Псевдокод:

$totals = array();

function add($in)
{
   global $totals;
   if(!isset($totals($in['id']))
   {
      $totals[$in['id']] = $in['value'];
   }else
   {
      $totals[$in['id']] += $in['value'];
   }
}

array_walk('add',$input_array);

var_dump($totals);
person PaulJWilliams    schedule 18.06.2009