为时间范围子数组中的每个值创建日期时间对象对于您的任务来说是不必要的开销。 strtotime() 为您提供您需要的,并且只提供您需要的。
作为最佳实践,您应该在找到符合条件的时间范围后立即执行早期返回,这样您的代码就不会执行浪费的迭代。
代码:(Demo)
$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() 提供快速返回而无需任何时间比较,并消除无用迭代所有一周中的其他日子。
代码:(Demo)
$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));
这可能是过早的优化。我不知道你的项目的规模和范围。我只是想提一下,以防未来研究人员的项目可以从中受益。