Объединение цены по умолчанию и специальной цены и временной шкалы сборки

#php #laravel #laravel-collection

#php #laravel #laravel-коллекция

Вопрос:

У меня есть 2 набора данных, которые мне нужно объединить / пересечь. Для этого я использую коллекцию Laravel.

Прайс-лист по умолчанию

  • Дата окончания не является обязательной. Отсутствие даты окончания означает, что цена действительна до дальнейшего уведомления
Элемент Цена за элемент Дата начала Дата окончания
Молоко 10 1 января 15 января
Молоко 11 16 января

Специальный прайс-лист (для каждого клиента)

  • Специальная цена всегда будет иметь конечную дату
Заказчик Элемент Цена Дата начала Дата окончания
Адам Молоко 8 2 января 8 января
Майк Молоко 8 9 января 20 января

Это мой ожидаемый результат (для Adam)

Элемент Цена Дата начала Дата окончания
Молоко 10 1 января 1 января
Молоко 8 2 января 8 января
Молоко 10 9 января 15 января
Молоко 11 16 января

Это мой ожидаемый результат (для Майка)

Элемент Цена Дата начала Дата окончания
Молоко 10 1 января 8 января
Молоко 8 9 января 20 января
Молоко 11 21 января

Мой мыслительный процесс (для каждого клиента), как показано ниже:-

  1. Объединил оба списка
  2. Вставьте / создайте другую запись на основе end_date и установите ее на следующий день (но я не знаю цену)
  3. Сортировать по start_date

Вот что я сделал до сих пор (пока я использую только Adam)

 $default = collect([
    ['item' => 'Milk', 'price' => 10, 'start_date' => Carbon::parse('2021-01-01'), 'end_date' => Carbon::parse('2021-01-15')],
    ['item' => 'Milk', 'price' => 9, 'start_date' => Carbon::parse('2021-01-16'), 'end_date' => null],
]);

$special = collect([
    ['item' => 'Milk', 'price' => 8, 'start_date' => Carbon::parse('2021-01-02'), 'end_date' => Carbon::parse('2021-01-05')],
]);

$combined = $default->merge($special);

$endDates = $combined->whereNotNull('end_date')->map(function($item, $key){
    return collect([
        'item' => 'Milk',
        'price' => $item['price'],
        'start_date' => $item['end_date']->addDay()->startOfDay(),
        'end_date' => null,
    ]);
});

$unsorted = $combined->merge($endDates);

$sorted = $unsorted->sortBy(function ($item, $key){
    return $item['start_date']->valueOf();
});

return $sorted->values()->all();
 

Комментарии:

1. Можете ли вы показать нам, какой код у вас уже есть? Что вы пробовали? Что не удалось?

2. @codedge я добавил свой код. Спасибо!