Ruless
@Ruless
Frontend development

Как исключить из массива занятое время?

Всем доброго времени суток.
Суть вопроса такова. Есть функция которая генерирует время на которое может записаться клиент.
$minutes = 60;
		$divition = 2;
		$part = $minutes / $divition;
		$array_times = array();
		for ($i=0; $i <= 23; $i++) { 
			for ($j=0; $j < 2; $j++) {
				if ($j == 0) {
					$array_times[] = $i . ":00";
				}else{
					$array_times[] = $i . ":" . $part * $j;
				}
			}
        }
       $array_working = array();
	$array_busy_time = array();
	$marker_write = false;
	// Сравнение 
	foreach ($array_times as $key => $value) {
            if (strcmp($value, $salon['begin_time']) == 0){
                $marker_write = true;
	}
			if (strcmp($value, $salon['end_time']) == 0){
                $marker_write = false;
				$array_working[] = $value;
			}
			if ($marker_write) {
                $array_working[] = $value;
			}
        }


На выходе получается массив.
После того как клиент записался на какое-то время оно удаляется из этого массива. Возвращает отдельно два массива с занятым временим и свободным и потом на js сравниваю массивы и удаляю занятое время из массива(так надо)
array_enroll_time - массив с занятым временем
foreach($enroll as $key2){
                $temp = explode('-', $key2['time']);

                foreach ($temp as $key) {
                    $array_enroll_time[] = $key;
                }
				// проверяем дату(день) на который была сделана запись и записываем время
				if (strcmp($key2['date'], $request['date']) == 0){
					$array_busy_time[] = $key2['time'];
				}
			}
			$result = array_diff($array_working, $array_busy_time);
            $date = $result;


В базе хранится в таком формате 12:30-13:00
Вроде все описал

Теперь вопрос, если в базе есть запись 12:30-13:00 то из массива со свободным временем удалит и 12:30 и 13:00 что впринцепе логично. Но мне нужно чтобы 13:00 осталось? Так как на это время клиент уже может записаться
Если же будет время записи таким 12:00-13:00. То мне нужно чтобы удалило 12:00, 12:30 и оставило 13:00

Надеюсь понятно объяснил))

Помогите а то что то не получается реализовать такое

использую laravel&vueJs
  • Вопрос задан
  • 87 просмотров
Пригласить эксперта
Ответы на вопрос 1
xEpozZ
@xEpozZ
Веб-разработчик
Накидал вам функцию проверки. Можете подставлять значения и тестировать работу.

<?php

function getBorderTimes($times){
    return explode('-', $times);
}

function getDateTime($time){
    return DateTime::createFromFormat('H:i', $time);
}

$enrollTime = '13:00-14:00';
$busyTimes = ['9:00-11:30', '11:30-13:00', '14:00-15:00'];

$enrollBorderTimes = getBorderTimes($enrollTime);
$enrollStartTime = getDateTime($enrollBorderTimes[0]);
$enrollStopTime = getDateTime($enrollBorderTimes[1]);

$canEnroll = true;
foreach ($busyTimes as $busyTime) {
    $borderTimes = getBorderTimes($busyTime);
    /**
     * $borderTimes[0] - время начала записи
     * $borderTimes[1] - время окончания записи
    */
    $startTime = getDateTime($borderTimes[0]);
    $stopTime = getDateTime($borderTimes[1]);

    /**
     * Если время начала записи в промежутке других записей, то считаем время записи невалидной
    */
    if($startTime < $enrollStartTime && $stopTime > $enrollStartTime){
        $canEnroll = false;
        break;
    }

    /**
     * Если время конца записи в промежутке других записей, то считаем время записи невалидной
    */
    if($startTime < $enrollStopTime && $stopTime > $enrollStopTime){
        $canEnroll = false;
        break;
    }
}
if($canEnroll){
    echo 'Можете записаться';
}else{
    echo 'Записаться нельзя';
}
echo PHP_EOL;
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы