У меня мой данные выглядит так:
[{"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"]}]
Манипулирование данными массива в формате 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"
]
}
]