Сроки и график состояния php - PullRequest
0 голосов
/ 22 сентября 2018

У меня есть массив типа

            $array = (
                0 => array(
                    "start" => "Mon 09:30",
                    "end" => "Mon 11:00"
                ) ,
                1 => array(
                    "start" => "Sun 14:10",
                    "end" => "Sun 20:00"
                ) ,
                array(
                    "start" => "Sun 07:30",
                    "end" => "Sun 08:00"
                ));

Есть ли идея выполнить функцию, только если текущее время находится в пределах этого времени.

example creation of array

Если текущее время находится между начальным и конечным эхом или вернет true.Дата не важна

Ответы [ 2 ]

0 голосов
/ 23 сентября 2018

Создание объектов даты и времени для каждого значения в подмассивах временного диапазона не требует дополнительных затрат для вашей задачи.strtotime() дает вам то, что вам нужно, и только то, что вам нужно.

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

Код: ( Демо )

$array = [
    ["start" => "Mon 09:30", "end" => "Mon 11:00"],
    ["start" => "Sun 14:10", "end" => "Sun 20:00"],
    ["start" => "Sun 07:30", "end" => "Sun 08:00"],
    ["start" => "Sun 08:30", "end" => "Sun 09:30"]
];

function in_range($array) {
    $now = time();  // using server timezone
    echo date("D H:i") , "\n";
    foreach ($array as $range) {
        if ($now >= strtotime($range["start"]) && strtotime($range["end"]) >= $now) {
            return $range;  // or true if you like
        }
    }
    return false;
}

var_export(in_range($array));

Вывод (на данный момент):

Sun 09:02
array (
  'start' => 'Sun 08:30',
  'end' => 'Sun 09:30',
)

Если этоневозможно, чтобы разные дневные имена встречались в одной и той же строке данных, поэтому вы можете дополнительно оптимизировать процесс поиска, удалив избыточности в массиве поиска.

Если вы реструктурируете свои дневные строки, которые будут сгруппированы поимя дня и используйте это значение в качестве ассоциативного ключа первого уровня, вы можете использовать isset(), чтобы предложить быстрый возврат без каких-либо временных сравнений и исключить возможность бесполезной итерации всех остальных дней недели.

Код: ( Демо )

$array = [
    "Mon" => [
        ["start" => "09:30", "end" => "11:00"]
    ],
    "Sun" => [
        ["start" => "07:30", "end" => "08:00"],
        ["start" => "08:30", "end" => "09:30"],
        ["start" => "14:10", "end" => "23:59"]
    ]
];

function in_range($array) {
    $dayname = date("D");
    if (!isset($array[$dayname])) {
        return false;  // quick, 1st level return
    }
    $now = date("H:i");
    foreach ($array[$dayname] as $range) {
        if ($now >= $range["start"] && $range["end"] >= $now) {
            return true;  // quick return
        }
    }
    return false;  // fallback return after iterating the dayname group
}

var_export(in_range($array));

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

0 голосов
/ 22 сентября 2018

Вот решение, однако не забудьте настроить часовой пояс вашей сети.На самом деле вам даже не нужен strtotime ().

<?php
$dateRanges = array(
    0 => array(
        "start" => "Mon 09:30",
        "end" => "Mon 11:00"
    ),
    1 => array(
        "start" => "Sun 14:10",
        "end" => "Sun 20:00"
    ),
    2 => array(
        "start" => "Sun 07:30",
        "end" => "Sun 08:00"
    )
);

function checkIfItIsNow($dateRanges){
    $now = date('D H:i');
    $result = false;
    foreach ($dateRanges as $range) {
        if(($now > $range['start']) && ($now < $range['end'])){
            $result = true;
            break;
        }
    }
    return $result;
}

$finalResult = checkIfItIsNow($dateRanges);
var_dump($finalResult);
?>

Дайте мне знать, если у вас есть какие-либо вопросы.

...