PHP - сумма различных массивов

Я пытался весь день суммировать ниже массив на основе значения и получать только отдельные значения.

Вот мой входной массив:

[
    {
        "commoditycodes": "6204.4400",
        "statisticalvalue": 1152.6,
        "cvr": "DK35425950"
    },
    {
        "commoditycodes": "6204.4400",
        "statisticalvalue": 542.4,
        "cvr": "DK35425950"
    },
    {
        "commoditycodes": "6104.4300",
        "statisticalvalue": 1827,
        "cvr": "DK35425950"
    },
    {
        "commoditycodes": "6114.3000",
        "statisticalvalue": 5211.36,
        "cvr": "DK37968552"
    },
    {
        "commoditycodes": "6114.3000",
        "statisticalvalue": 798.64,
        "cvr": "DK99999999"
    }
]

Я пытаюсь «собрать» все массивы, которые имеют значение такой жеcvr, но по-прежнему показывать его отдельно на основе commoditycodes. Нравится:

{
    "commoditycodes": "6204.4400",
    "statisticalvalue": 1695,
    "cvr": "DK35425950"
},
{
    "commoditycodes": "6104.4300",
    "statisticalvalue": 1827,
    "cvr": "DK35425950"
},
{
    "commoditycodes": "6114.3000",
    "statisticalvalue": 5211.36,
    "cvr": "DK37968552"
},
{
    "commoditycodes": "6114.3000",
    "statisticalvalue": 798.64,
    "cvr": "DK99999999"
}

]

Как видите, из ввода первые два результата из моего массива имеют:

  • Идентичный код товара
  • Идентичное значение CVR

Затем мы суммируем statisticalvalue.

Третий результат имеет то же значение CVR, что и два первых, тем не мение значение commoditycode отличается, поэтому это уникальное значение.

Четвертый и пятый элементы моих массивов также уникальны.

В общем, я пытаюсь суммировать statisticalvalue, где:

  • Значение CVR такое же
  • Код товара тот же

Я пробовал ниже:

$result = [];

foreach ($array as $val) {
    //Not a duplicate cvr code
    if (!isset($result[$val['cvr']])) {
        $result[$val['cvr']] = $val;
    //Duplicate cvr code.
    } else {
        $result[$val['cvr']]['statisticalvalue'] += $val['statisticalvalue'];

    }
}

Но это возвращается ниже, которые принимают только уникальные значения cvr, но не commoditycodes:

[
    {
        "commoditycodes": "6104.6300",
        "statisticalvalue": 68701.56,
        "cvr": "DK35425950"
    },
    {
        "commoditycodes": "6104.6300",
        "statisticalvalue": 21108.95,
        "cvr": "DK37968552"
    },
    {
        "commoditycodes": "6114.3000",
        "statisticalvalue": 798.64,
        "cvr": "DK99999999"
    }
]

Я совсем запутался, как это проверить?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
6
0
250
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Сделать массив со сложным индексом $val['cvr'].'|'.$val['commoditycodes']

$result = [];

foreach ($array as $val) {
    $index = $val['cvr'].'|'.$val['commoditycodes'];
    if (!isset($result[$index])) {
        $result[$index] = $val;
    //Duplicate
    } else {
        $result[$index]['statisticalvalue'] += $val['statisticalvalue'];
    }
}

Если вы хотите создать массив результатов с числовым индексом, добавьте после цикла:

$result = array_values($result);

Это должно работать хорошо, если вам не нужно сохранять формат элементов массива.

Siavas 28.01.2019 15:57

Что ты имеешь в виду?

splash58 28.01.2019 16:26

Если он хочет выполнить агрегацию для элементов с этими двумя похожими ключами, ему нужно будет сохранить ту же структуру объекта, как он показал во фрагменте после that returns below. Однако его код этого не делает.

Siavas 28.01.2019 16:29

@splash58 это прекрасно работает! Такое "простое" решение. Большое спасибо!!! Действительно ценю это.

oliverbj 29.01.2019 08:32

Рад помочь. Удачи!

splash58 29.01.2019 10:16

Другие вопросы по теме