0

希望一切都好。我需要打印一个数组作为时隙。

假设2021.11.15on11:30am to 12:00pm和有 2 个订单2:00pm to 4:15pm

我的订单需要1h 30m完成。因此,时间段应该介于8:00am and 6:00pm为已经存在的订单跳过这些时间之间。

我的预期结果应该是:

array:2 [
  0 => array:2 [
    "start" => "08:00:00"
    "end" => "9:30:00"
  ]
  1 => array:2 [
    "start" => "09:30:00"
    "end" => "11:00:00"
  ]
  2 => array:2 [
    "start" => "12:00:00"
    "end" => "13:30:00"
  ]
  3 => array:2 [
    "start" => "16:15:00"
    "end" => "17:45:00"
  ]
]

以下行用于获取现有订单对象及其开始和结束时间。

$existOrders = $this->orderHasPropartnerService->getOrderExistForDateProPartner($proPartnerDefaultLocation->id, $selectedDateRecord->date);

然后我只是循环它。

if ($existOrders->count() > 0) {
                $dateStartTime = $selectedDateRecord->time_from;
                $x = 0;

                $firstEndingTime = Carbon::parse($dateStartTime)->addMinutes($totalTimeToOrder)->format('H:i:s');

                foreach ($existOrders as $key1 => $existOrder1) {

                    if ($existOrder1->order->time_slot_from < $firstEndingTime && $existOrder1->order->time_slot_to >= $firstEndingTime) {
                        $timeCheckArray[$x]['start'] = $existOrder1->order->time_slot_to;
                        $timeCheckArray[$x]['end'] = Carbon::parse($existOrder1->order->time_slot_to)->addMinutes($totalTimeToOrder)->format('H:i:s');
                    } else {
                        $timeSlotArray[$x]['start'] = $dateStartTime;
                        $timeSlotArray[$x]['end'] = $firstEndingTime;

                        $timeCheckArray[$x]['start'] = $firstEndingTime;
                        $timeCheckArray[$x]['end'] = Carbon::parse($firstEndingTime)->addMinutes($totalTimeToOrder)->format('H:i:s');
                    }

                    if (isset($existOrders[$key1+1])) {
                        if ($existOrders[$key1+1]->order->time_slot_from < $timeCheckArray[$x]['end'] && $existOrders[$key1+1]->order->time_slot_to >= $timeCheckArray[$x]['end']) {

                        } else {
                            $timeSlotArray[$x+1]['start'] = $timeCheckArray[$x]['start'];
                            $timeSlotArray[$x+1]['end'] = $timeCheckArray[$x]['end'];
                        }
                    }
                }
            }

至于上面的例子$dateStartTime将是8:00am. 的值$totalTimeToOrder将是1h 30m

当我尝试打印$timeSlotArray时,结果如下:

array:2 [
  0 => array:2 [
    "start" => "08:00:00"
    "end" => "09:30:00"
  ]
  1 => array:2 [
    "start" => "08:00:00"
    "end" => "09:30:00"
  ]
]

如果有人指出我在这个逻辑中犯错的地方,我将不胜感激。非常感谢你们宝贵的时间来解决我的问题。

4

1 回答 1

1

最好的方法是运行一个 for 循环来检查新订单是否在预定时间之间。

通过将其转换为 PHP Date 对象来尝试类似的事情

$NewOrder= "4:59 pm";
$start= "5:42 am";
$end= "6:26 pm";

$date1 = DateTime::createFromFormat('h:i a', $NewOrder);
$date2 = DateTime::createFromFormat('h:i a', $start);
$date3 = DateTime::createFromFormat('h:i a', $end);
if ($date1 > $date2 && $date1 < $date3)
{
   echo 'Not safe to add it ';
}
于 2021-11-11T05:36:10.887 回答