#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 января |
Мой мыслительный процесс (для каждого клиента), как показано ниже:-
- Объединил оба списка
- Вставьте / создайте другую запись на основе
end_date
и установите ее на следующий день (но я не знаю цену) - Сортировать по
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 я добавил свой код. Спасибо!