我有一个类似
的数组 $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"
));
只有在当前时间在该时间之内,才有执行功能的想法。
如果当前时间在开始和结束之间,或者返回true。日期不重要
答案 0 :(得分:2)
这是一个解决方案,但是,请不要忘记调整您的网络时区。实际上,您甚至不需要任何strtotime()。
missing tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904
dangling tree 3178c349021f733a9fa7fa0fabd2ac34f8841bdd
如果您有任何问题,请告诉我。
答案 1 :(得分:1)
为时间范围子数组中的每个值创建datetime对象对于您的任务来说是不必要的开销。 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));
这可能是过早的优化。我不知道您的项目规模和范围。我只是想提到这一点,以防将来的研究人员的项目可以从中受益。