Giovanni Rizza
Giovanni Rizza

Reputation: 49

PHP Sum multidimensional array values where certain index is the same

just a simple problem here. I have the following array:

Array(21) {
[0] => Array(7) {
    ["punti"] => Integer  418
    ["vittorie"] => Integer  9
    ["podi"] => Integer  18
    ["gv"] => Integer  14
    ["id_pilota"] => Integer  1
    ["team"] => String(15) "Red Bull Racing"
    ["naz"] => String(2) "it"
}
[1] => Array(7) {
    ["punti"] => Integer  353
    ["vittorie"] => Integer  6
    ["podi"] => Integer  16
    ["gv"] => Integer  3
    ["id_pilota"] => Integer  19
    ["team"] => String(16) "Scuderia Ferrari"
    ["naz"] => String(2) "it"
}
[2] => Array(7) {
    ["punti"] => Integer  335
    ["vittorie"] => Integer  4
    ["podi"] => Integer  15
    ["gv"] => Integer  1
    ["id_pilota"] => Integer  5
    ["team"] => String(12) "Mercedes-AMG"
    ["naz"] => String(2) "it"
}
[3] => Array(7) {
    ["punti"] => Integer  181
    ["vittorie"] => Integer  1
    ["podi"] => Integer  5
    ["gv"] => Integer  1
    ["id_pilota"] => Integer  2
    ["team"] => String(12) "Mercedes-AMG"
    ["naz"] => String(2) "it"
}
[4] => Array(7) {
    ["punti"] => Integer  147
    ["vittorie"] => Integer  0
    ["podi"] => Integer  3
    ["gv"] => Integer  0
    ["id_pilota"] => Integer  14
    ["team"] => String(15) "Racing Point F1"
    ["naz"] => String(2) "mx"
}
[5] => Array(7) {
    ["punti"] => Integer  127
    ["vittorie"] => Integer  0
    ["podi"] => Integer  0
    ["gv"] => Integer  0
    ["id_pilota"] => Integer  13
    ["team"] => String(7) "Haas F1"
    ["naz"] => String(2) "dk"
}

which goes down to 21 elements.

My goal is to sum up all the points ("punti" indexes), based on each pilot's team. So to obtain something like this:

Array(10) {
[0] => Array(2) {
    ["team"] => String(...) "Mercedes-AMG")
    ["points"] => Integer  516

I know this is quite easy, but what is the quickest / most convenient way to solve such problem?

Upvotes: 1

Views: 174

Answers (2)

mikerojas
mikerojas

Reputation: 2338

Something like below should do it:

function sum_teams($arr = []) {
    // array for final results
    $collection = [];

    foreach ($arr as $item) {
        $keys = array_keys($item);

        foreach ($keys as $key) {
            $value = $item[$key];

            // check if we captured the key already
            if ($collection[$key]) {
                // increment up by current value
                $collection[$key] += $value;
            } else {
                // set to current value
                $collection[$key] = $value;
            }
        }
    }
    return $collection;
}
// call it with your array
$result = sum_teams($some_array);
printr_r($result);

Upvotes: 2

Nick
Nick

Reputation: 147166

You need to iterate over your results, adding a new entry to the output when you encounter a new team, or updating the points value when you find the same team again. This is most easily done by initially indexing the output by the team name, and then using array_values to re-index the array numerically:

$teams = array();
foreach ($results as $result) {
    $team = $result['team'];
    if (!isset($teams[$team])) {
        $teams[$team] = array('team' => $team, 'points' => $result['punti']);
    }
    else {
        $teams[$team]['points'] += $result['punti'];
    }
}
$teams = array_values($teams);
print_r($teams);

Output (for your sample data):

Array
(
    [0] => Array
        (
            [team] => Red Bull Racing
            [points] => 418
        )
    [1] => Array
        (
            [team] => Scuderia Ferrari
            [points] => 353
        )
    [2] => Array
        (
            [team] => Mercedes-AMG
            [points] => 516
        )
    [3] => Array
        (
            [team] => Racing Point F1
            [points] => 147
        )
    [4] => Array
        (
            [team] => Haas F1
            [points] => 127
        )
)

Demo on 3v4l.org

Upvotes: 2

Related Questions