PHP Суммирование значений многомерного массива, где определенный индекс совпадает - PullRequest
1 голос
/ 28 марта 2020

просто простая проблема здесь. У меня есть следующий массив:

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"
}

, который уменьшается до 21 элемента.

Моя цель - суммировать все баллы (индексы "punti"), основанные на команде каждого пилота. Итак, чтобы получить что-то вроде этого:

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

Я знаю, что это довольно легко, но какой самый быстрый / удобный способ решить такую ​​проблему?

Ответы [ 2 ]

2 голосов
/ 28 марта 2020

Вам нужно перебирать результаты, добавляя новую запись в вывод, когда вы встречаете новую команду, или обновлять значение очков, когда вы снова находите ту же команду. Это проще всего сделать, сначала индексировав выходные данные по имени команды, а затем используя array_values для числового переиндексирования массива:

$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);

Вывод (для данных примера):

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
        )
)

Демонстрация на 3v4l.org

2 голосов
/ 28 марта 2020

Что-то вроде ниже должно сделать это:

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);

...