我已经编写了一些代码来从数据库中检索不同餐厅的各种工作时间,并显示它们是否现在不开放。
工作时间定义如下:TextProperty1
。
问题是我找不到编写以下所有代码的简短方法。我怎样才能缩短它的长度?
10:30to13:30/18:30to22:30
答案 0 :(得分:3)
我可能错了,但看看这段代码,看来你正在做的是显示餐馆现在是否开放。
在那里要优化的内容有很多:
$timestamp = time();
以及与之关联的其他变量。这是相当低效的,因为在执行脚本期间时间不会有太大变化。即使脚本运行超过一秒钟,这实际上可以忽略不计。这必须在循环之前声明一次。$currentTime = new DateTime('now');
$currentDay = strtolower($currentTime->format('l'));
if($result > 0) {
while($row = $stmt->fetch()) {
$schedule = explode('/',
str_replace('to', '/', $row[$currentDay])
);
foreach($schedule as $time) {
$schedule['time'][] = DateTime::createFromFormat('G:i', $time);
}
$status =
($schedule['time'][0] <= $currentTime && $currentTime <= $schedule['time'][1])
||
($schedule['time'][2] <= $currentTime && $currentTime <= $schedule['time'][3])
? $lang["READY"]
: $lang["NO-READY"];
/*
HTML GOES HERE
*/
}
}
else {
echo '0 results';
}
由于在执行脚本期间日期和时间不太可能发生变化,我们在开始时移动了该部分。
这会为“now”返回DateTime
个对象,无需拨打time()
:
$currentTime = new DateTime('now');
这将返回今天的完整文本日,将其转换为小写以匹配数据库记录(例如:tuesday
):
$currentDay = strtolower($currentTime->format('l'));
然后对于每个迭代的记录:
$row[$currentDay]
,这是今天的数据。to
替换为/
,结果为xx:xx/xx:xx/xx:xx/xx:xx
。我们使用/
爆炸。
$schedule = explode('/',
str_replace('to', '/', $row[$currentDay])
);
我们现在有一个包含4个值的数组:
Array
(
[0] => 9:30
[1] => 13:30
[2] => 17:30
[3] => 20:30
)
我们从每个值创建一个DateTime
对象,我们存储在同一个数组中:
foreach($schedule as $time) {
$schedule['time'][] = DateTime::createFromFormat('G:i', $time);
}
我们现在有了这个数组:
Array
(
[0] => 9:30
[1] => 13:30
[2] => 17:30
[3] => 20:30
[time] => Array
(
[0] => DateTime Object
(
[date] => 2015-09-29 09:30:00.000000
[timezone_type] => 3
[timezone] => Europe/Paris
)
[1] => DateTime Object
(
[date] => 2015-09-29 13:30:00.000000
[timezone_type] => 3
[timezone] => Europe/Paris
)
[2] => DateTime Object
(
[date] => 2015-09-29 17:30:00.000000
[timezone_type] => 3
[timezone] => Europe/Paris
)
[3] => DateTime Object
(
[date] => 2015-09-29 20:30:00.000000
[timezone_type] => 3
[timezone] => Europe/Paris
)
)
)
我们使用三元运算符来设置状态(true ? true : false
)
这将检查“现在”是否在同一时间的早晨或晚上之间。
$status =
($schedule['time'][0] <= $currentTime && $currentTime <= $schedule['time'][1])
||
($schedule['time'][2] <= $currentTime && $currentTime <= $schedule['time'][3])
? $lang["READY"]
: $lang["NO-READY"];
$status
现已推出,可以构建html。
重复直到没有记录为止。
我们退出循环。
我们已经完成了。