Как объединить данные внутри данных JSON в PHP - PullRequest
0 голосов
/ 26 октября 2018

У меня есть данные , которые выглядят так:

[{"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"]}]

1 Ответ

0 голосов
/ 26 октября 2018

Манипулирование данными массива в формате 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"
        ]
    }
]
...