Как объединить данные внутри данных json в php

У меня мой данные выглядит так:

[{"REG":"SK", "RES":"PAN1", "WELL":"P1-TG", "TIME":"2005-03-27"},
{"REG":"SK", "RES":"PAN1", "WELL":"P1-TG", "TIME":"2005-04-13"},
{"REG":"SK", "RES":"PAN1", "WELL":"P1-TG", "TIME":"2006-06-07"},
{"REG":"SK", "RES":"PAN2", "WELL":"P2-TG", "TIME":"2009-01-18"},
{"REG":"SK", "RES":"PAN3", "WELL":"P3-TG", "TIME":"2009-03-01"},
{"REG":"SK", "RES":"PAN3", "WELL":"P3-TG", "TIME":"2010-03-14"}]

и это мой код:

$query =[{my data}];
$list = [];

foreach($query as $index => $q){
     if ($index != 0){
         $key = $index - 1;
         $filter = [];
         if ($q->WELL == $query[$key]->WELL){ 
             array_push($list,array_merge_recursive(json_decode(json_encode($q),true),json_decode(json_encode($query[$key]),true)));
         }else{
             array_push($list,$q);
         }
     }else{
         array_push($list,$q);
     }
}

мой результат после запуска моим кодом:

[{"REG":"SK", "RES":"PAN1", "WELL":"P1-TG", "TIME":"2005-03-27"},
    {"REG":["SK","SK"], "RES":["PAN1","PAN1"], "WELL":["P1-TG","P1-TG"], "TIME":["2005-03-27","2005-04-13"]},
    {"REG":["SK","SK"], "RES":["PAN1","PAN1"], "WELL":["P1-TG","P1-TG"], "TIME":["2005-04-13","2006-06-07"]},
    {"REG":"SK", "RES":"PAN2", "WELL":"P2-TG", "TIME":"2009-01-18"},
    {"REG":"SK", "RES":"PAN3", "WELL":"P3-TG", "TIME":"2009-03-01"},
    {"REG":["SK","SK"], "RES":["PAN3","PAN3"], "WELL":["P3-TG","P3-TG"], "TIME":["2009-03-01","2010-03-14"]}]

и я хочу:

[{"REG":"SK", "RES":"PAN1", "WELL":"P1-TG", "TIME":["2005-03-27","2005-04-13","2006-06-07"]},
{"REG":"SK", "RES":"PAN2", "WELL":"P2-TG", "TIME":"2009-01-18"},
{"REG":"SK", "RES":"PAN3", "WELL":"P3-TG", "TIME":["2009-03-01","2010-03-14"]}]
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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 и хотите разрабатывать...
0
0
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Манипулирование данными массива в формате json является громоздким и обычно подверженным ошибкам делом. Первое, что нужно сделать, это преобразовать json в массив, чтобы вы могли использовать простые и мощные функции обработки массивов php.

Вы хотите сгруппировать данные на основе значений первых трех элементов. Чтобы сделать это эффективно, вы создаете временные составные ключи, то есть временные ассоциативные ключи, которые содержат объединенные значения в виде строки.

Это помогает вашему коду определить, имеете ли вы дело с первым вхождением или нет. Это ценная информация, потому что вы хотите хранить данные по-разному на основе этих знаний.

Код: (Демо)

$json = '[{"REG":"SK", "RES":"PAN1", "WELL":"P1-TG", "TIME":"2005-03-27"},
{"REG":"SK", "RES":"PAN1", "WELL":"P1-TG", "TIME":"2005-04-13"},
{"REG":"SK", "RES":"PAN1", "WELL":"P1-TG", "TIME":"2006-06-07"},
{"REG":"SK", "RES":"PAN2", "WELL":"P2-TG", "TIME":"2009-01-18"},
{"REG":"SK", "RES":"PAN3", "WELL":"P3-TG", "TIME":"2009-03-01"},
{"REG":"SK", "RES":"PAN3", "WELL":"P3-TG", "TIME":"2010-03-14"}]';

foreach (json_decode($json, true) as $row) {  // convert json to array and iterate rows
    $composite_key = implode('-', array_slice($row, 0, 3));  // group by the first 3 row values
    if (!isset($result[$composite_key])) {  // if 1st occurrence of first 3 row values
        $row['TIME'] = [$row['TIME']];      // adjust last value in row to be a subarray
        $result[$composite_key] = $row;     // store the full data
    } else {
        $result[$composite_key]['TIME'][] = $row['TIME'];  // push only the TIME value into the subarray
    }
}
echo json_encode(array_values($result), JSON_PRETTY_PRINT);  // re-index, convert to json and display

Вывод: (PRETTY_PRINT использовать не нужно, просто мой ответ легче читать)

[
    {
        "REG": "SK",
        "RES": "PAN1",
        "WELL": "P1-TG",
        "TIME": [
            "2005-03-27",
            "2005-04-13",
            "2006-06-07"
        ]
    },
    {
        "REG": "SK",
        "RES": "PAN2",
        "WELL": "P2-TG",
        "TIME": [
            "2009-01-18"
        ]
    },
    {
        "REG": "SK",
        "RES": "PAN3",
        "WELL": "P3-TG",
        "TIME": [
            "2009-03-01",
            "2010-03-14"
        ]
    }
]

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