php - 我刚刚写了一个糟糕的 PHP 函数,我需要一些帮助(elseif 链 - 开关?)

标签 php optimization

我正在制作一个网站,它根据现在的时间确定数组的值。我写了这个糟糕的(功能性的)脚本,想知道我是否可以让它更简洁。我从 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 时钟,但这是我正在处理的网站:

Time Table .

每个数组都基于我的位置,并且有 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/

相关文章:

PHPUnit - 未抛出异常测试?

php+mysql : how to read several time results of query

php显示不断变化的变量nummer

optimization - 如何在不使用循环的情况下或以更有效的方式计算R中的 "consecutive mean"?

java - Java 是否优化掉了一个仅用作返回值的字段?

php - 按字段排序 SQL 状态异常 1064

PHP 如果不是字符串

c++ - 为什么在比较范围内的数字时,汇编代码中会出现分支?

java - 在 Tic Tac Toe 中表示游戏状态

optimization - 避免 R 中的循环