Перекрывающиеся даты в Laravel

Раньше я хотел получить временные интервалы между $starttime и $endtime, разделенные на значение $duration.

Нам удалось заставить его работать с помощью этого кода:

$starttime = '9:00';  // your start time
$endtime = '21:00';  // End time
$duration = '30';  // split by 30 mins

$array_of_time = array ();
$start_time    = strtotime ($starttime); //change to strtotime
$end_time      = strtotime ($endtime); //change to strtotime

$add_mins  = $duration * 60;

while ($start_time <= $end_time) // loop between time
{
   $array_of_time[] = date ("h:i", $start_time);
   $start_time += $add_mins; // to check endtie=me
}

$new_array_of_time = array ();
for($i = 0; $i < count($array_of_time) - 1; $i++)
{
    $new_array_of_time[] = '' . $array_of_time[$i] . ' - ' . $array_of_time[$i + 1];
}

Теперь проблема в том, что я не хочу показывать временные интервалы, соответствующие датам, в моей таблице встречи.

Чтобы получить встречи, соответствующие этой дате, я сделал:

$appointments = Appointment::where('user_id', $user->id)->where('appointment_datetime', $date->toDateString() )->get();

Теперь это возвращает мне все встречи, ... в каждой встрече у нас есть столбец assign_start и assign_end, которые сформированы в ВРЕМЯ.

Следующим шагом будет проверка всех встреч на предмет совпадения временных интервалов ... и именно здесь я застрял. Спасибо за помощь.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
4
0
402
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это может помочь

<?php
$date = \Carbon\Carbon::now(); // the date you need to check
$starttime = \Carbon\Carbon::create($date->year, $date->month, $date->day, 9,0);  // your start time
$endtime = \Carbon\Carbon::create($date->year, $date->month, $date->day, 21,0); // end time
$add_mins  = 60; // minutes to add to each meeting
$array_of_time = [];
$current_time = $starttime->copy();

while($current_time->isBefore($endtime)){
    // check if we have record between current and current + $add_mins
    // I suppose appointment_datetime is a datetime field in database
    if (!Appointment::where('user_id', $user->id)->whereBetween('appointment_datetime', [$current_time, $current_time->copy()->addMinute($add_mins)])->count()){
        $array_of_time[] = $current_time->format('H:i') . ' - ' . $current_time->copy()->addMinute($add_mins)->format('H:i');
    }
    $current_time->addMinute($add_mins);
}
Ответ принят как подходящий

Просто замените код на этот:

$starttime = '9:00';  // your start time
$endtime = '21:00';  // End time
$duration = '30';  // split by 30 mins

$array_of_time = array ();
$start_time    = strtotime ($starttime); //change to strtotime
$end_time      = strtotime ($endtime); //change to strtotime

$add_mins  = $duration * 60; // seconds

while ($start_time <= $end_time) // loop between time
{
 $array_of_time[] = date ("h:i", $start_time);
 $start_time += $add_mins; // to check endtie=me
}

// Here I am getting the indexes of the time slot which has appointment
$indexes_to_be_skipped = array();
foreach($appointments as $appointment) {
  for($i=0;$i<count($array_of_time); $i++) {
    if ($array_of_time[$i] == date ("h:i", strtotime($appointment['appointment_time_start']))) {
      $indexes_to_be_skipped[$i] = $i;
    }
  }
}

$new_array_of_time = array ();
for($i = 0; $i < count($array_of_time) - 1; $i++)
{
  $new_array_of_time[] = '' . $array_of_time[$i] . ' - ' . $array_of_time[$i + 1];

  // check if current time slot has already appointment
  if (isset($indexes_to_be_skipped[$i])) {
    // then remove it
    unset($new_array_of_time[$i]);
  }
}

// resetting index
$narray_of_time = $new_array_of_time;
$new_array_of_time = array();
foreach($narray_of_time as $item) {
  $new_array_of_time[] = $item;
}

Я надеюсь, что это помогает!

Работает как шарм

Ali M 09.09.2018 14:35

Другие вопросы по теме