#php #json #sorting
Вопрос:
Привет, у меня есть вопрос о логике, и я не могу его решить. У меня есть данные json, и я хочу переформатировать, сгруппировав данные, если цена и тип совпадут на следующий день, пожалуйста, проверьте мои данные Json ниже
[
{
"price": 1000,
"date": "2021-03-13",
"type": "A"
},
{
"price": 1000,
"date": "2021-03-14",
"type": "A"
},
{
"price": 1000,
"date": "2021-03-15",
"type": "A"
},
{
"price": 1300,
"date": "2021-03-16",
"type": "A"
},
{
"price": 1000,
"date": "2021-03-17",
"type": "A"
},
{
"price": 1300,
"date": "2021-03-18",
"type": "A"
},
{
"price": 1500,
"date": "2021-03-19",
"type": "A"
},
{
"price": 1500,
"date": "2021-03-20",
"type": "A"
},
{
"price": 1500,
"date": "2021-03-21",
"type": "A"
},
{
"price": 1500,
"date": "2021-03-22",
"type": "A"
},
{
"price": 2000,
"date": "2021-03-13",
"type": "B"
},
{
"price": 2000,
"date": "2021-03-14",
"type": "B"
},
{
"price": 2000,
"date": "2021-03-15",
"type": "B"
},
{
"price": 2000,
"date": "2021-03-16",
"type": "B"
},
{
"price": 2000,
"date": "2021-03-17",
"type": "B"
}
]
Я хочу переформатировать так (группировка данных с одинаковой ценой и типом)
[
[
"type"=> "A"
"price"=> 1000
"startDate"=> "2021-03-13"
"endDate"=> "2021-03-15"
],
[
"type"=> "A"
"price"=> 1300
"startDate"=> "2021-03-16"
"endDate"=> "2021-03-16"
],
[
"type"=> "A"
"price"=> 1000
"startDate"=> "2021-03-17"
"endDate"=> "2021-03-17"
],
[
"type"=> "A"
"price"=> 1300
"startDate"=> "2021-03-18"
"endDate"=> "2021-03-18"
],
[
"type"=> "A"
"price"=> 1500
"startDate"=> "2021-03-19"
"endDate"=> "2021-03-22"
],
[
"type"=> "B"
"price"=> 2000
"startDate"=> "2021-03-13"
"endDate"=> "2021-03-17"
],
]
На данный момент у меня есть только представление о создании временного массива и циклических данных json, но я понятия не имею, как преобразовать их в дату начала и дату окончания
Ответ №1:
Вам понадобится временный ассистент. массив, как «кэш» сортировки, и результирующий массив. Для каждого типа обратите внимание на цену и дату начала в кэше, используйте тип в качестве ключа.
Иллюстрация доц.кэша. массив:
$cache = [
"A"=>[
"price"=>1000,
"date"=>"2021-03-13",
"type"=>"A"
],
]
Сначала отсортируйте массив по дате. Затем зациклите массив и создайте свои записи «кэша» во временной ассоциации. массив. При создании «дата» — это ваша «Дата начала». Поскольку ключа «А» еще не существует, вы знаете, что вам не нужно ничего сравнивать.
Но если тип элемента уже присутствует в кэше (несколько циклов по дороге), вы знаете, что это не первое его появление в цикле, поэтому теперь вы сравниваете цену.
Если цена одинакова, вы обновляете «Дату окончания» в своем кэше. Если цена отличается, вы помещаете элемент из кэша в массив результатов — у вас уже есть дата начала и дата окончания. Возможно, вам захочется удалить ключ «дата» из элемента, прежде чем помещать его в результат.
И, наконец, вы обновляете элемент в кэше с новой датой начала и ценой (и удаляете конечную дату или воссоздаете весь элемент целиком) и начинаете с новых элементов исходного массива.