【发布时间】:2021-07-18 09:37:56
【问题描述】:
我正在为各种套餐开发一个预订系统,每个套餐都有不同的持续时间。客户应该从选定的日期获得可用的时间段。该日期可能包含具有不同时间间隔的不同包裹预订。所以,我要做的是通过跳过所有预订的时间段来提取日期的可用时间段。
预期输出是:
08:00 AM
10:30 AM // 09:00 AM has a booking. and its duration is 1.5 hours
11:30 AM // The current package has 1 hour duration
... until the shop closes for eg 08:00 PM
我正在使用 CarbonPeriod 来获取时间段列表。但是,我无法应用过滤器来跳过所有预订的时间段。
$hours = new CarbonPeriod(
$opening,
$this->duration() . ' minutes',
$closing->subMinutes($this->duration())
);
$hours->filter(function ($date) use ($booked) {
$toSkip = [];
foreach ($booked as $bookedItem) {
$bookingTime = Carbon::parse($bookedItem->time);
$completingTime = Carbon::parse($bookedItem->time)->addMinutes($bookedItem->package->duration());
if ($date->isBetween($bookingTime, $completingTime)) {
array_push($toSkip, $date);
}
}
return !in_array($date, $toSkip);
});
任何帮助将不胜感激!
【问题讨论】:
-
我想您的问题之一是您的
return语句在您的foreach循环内。这意味着它的过滤方法只会检查$booked中的第一项 -
@Rwd,感谢您的支持!这是我将 return 语句放在循环之外后得到的结果:
[ "11:00 AM", "02:00 PM", "03:00 PM", "04:00 PM", "05:00 PM", "06:00 PM", "07:00 PM", ]但是,在上午 10:30 - 上午 11:00、下午 01:30 - 下午 2:30 之间缺少一个时段。我能做到这一点吗?谢谢
标签: php laravel php-carbon