Переформатируйте данные JSON и группируйте данные по диапазону дат

#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"
     ],
]
 

Сначала отсортируйте массив по дате. Затем зациклите массив и создайте свои записи «кэша» во временной ассоциации. массив. При создании «дата» — это ваша «Дата начала». Поскольку ключа «А» еще не существует, вы знаете, что вам не нужно ничего сравнивать.

Но если тип элемента уже присутствует в кэше (несколько циклов по дороге), вы знаете, что это не первое его появление в цикле, поэтому теперь вы сравниваете цену.

Если цена одинакова, вы обновляете «Дату окончания» в своем кэше. Если цена отличается, вы помещаете элемент из кэша в массив результатов — у вас уже есть дата начала и дата окончания. Возможно, вам захочется удалить ключ «дата» из элемента, прежде чем помещать его в результат.

И, наконец, вы обновляете элемент в кэше с новой датой начала и ценой (и удаляете конечную дату или воссоздаете весь элемент целиком) и начинаете с новых элементов исходного массива.