我正在制作一个网站,它根据现在的时间确定数组的值。我写了这个糟糕的(功能性的)脚本,想知道我是否可以让它更简洁。我从 case/switch 语句开始,但在使用多个条件时遇到了问题。这是肮脏的行为:
if ($now < november 18th) {
$array_to_use = $home;
}
elseif (november 18th < $now && $now < november 21st ) {
$array_to_use = $driving;
}
elseif (november 21st < $now && $now < november 22nd) {
$array_to_use = $flying;
}
...
...
...
elseif (february 1st < $now) {
$array_to_use = $arrived;
}
else {
$array_to_use = $default;
}
调度表其实更复杂,里面有13个elseif
语句。有人可以确认我只是遇到了编码障碍,还有更好的方法吗?
编辑:我将 Unix 时间戳更改为粗略的实时时间,以便更容易理解我在做什么(希望如此)
编辑 2: 请原谅当前损坏的 Javascript 时钟,但这是我正在处理的网站:
每个数组都基于我的位置,并且有 15 个“它们当前”基于时间。这是一个已知开始/结束时间的小问题域,因此灵 active 不是关键,只需将其全部写入即可。可以看到时间是连续的,一次只需要选择一个字符串数组。
最佳答案
首先,请取出您的硬编码数字并将它们放入常量中。
$FLIGHT_START_TIME = 1258956001;
$FLIGHT_END_TIME = 1260511201;
其次,我会为每个条件语句制作迷你函数:
即
function isFlying($time)
{
return ( $FLIGHT_START_TIME < $time && $time < $FLIGHT_END_TIME );
}
第三,将你的整个条件集合放入一个函数中以获取你的当前状态,并在你的函数调用中替换:
function getStateArrayForTime($time)
{
if (isDriving($time)
{
return $driving;
}
if ( isFlying($time) )
{
return $flying;
}
...etc
}
最后,将整个内联代码部分替换为您的单个函数调用:
$currentState = getStateArrayForTime($now);
正如其他发帖人也评论的那样,如果您只知道开始和结束时间将是状态参数,此时您可以使用数据表驱动函数返回状态:
因此将 getStateArrayForTime 的实现替换为:
function getStateArrayForTime ($time)
{
//
$states = array (
array("startTime" => 1258956001, "endTime" => 1260511201, "state" => $flying),
array("startTime" => 1260511201, "endTime" => 1260517000, "state" => $driving),
..etc...
);
foreach($states as $checkStateArray)
{
if($checkStateArray['startTime'] < $time && $time < $checkStateArray['endTime'])
{
return $checkStateArray['state'];
}
}
return null;
}
最后,有些人可能会问“为什么要按这个顺序做事?”除了在应用程序中,我完全不能称赞,但 Martin Fowler 有一本名为“重构”的好书解释了为什么你一次清理代码一步,并在每一步进行测试,最后大量替换没有意义的功能,同时测试它们在功能上是否等效。
关于php - 我刚刚写了一个糟糕的 PHP 函数,我需要一些帮助(elseif 链 - 开关?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1731439/