为非技术用户构建一个*高效* if / then接口,以在PHP中构建流控制

时间:2010-04-12 18:50:03

标签: php performance conditional

我目前正在构建一个内部工具,供我们的管理层用来控制流量。我已经构建了一个if / then接口,允许用户为某些结果设置条件,但是使用switch语句来控制流是低效的。如何提高代码的效率? 代码示例:

            if($previous['route_id'] == $condition['route_id'] && $failed == 0) //if we have not moved on to a new set of rules and we haven't failed yet
        {   
            switch($condition['type'])
            {
                case 0 :
                    $type = $user['hour'];
                break;
                case 1 :
                    $type = $user['location']['region_abv'];
                break;
                case 2 :
                    $type = $user['referrer_domain'];
                break;
                case 3 :
                    $type = $user['affiliate'];
                break;
                case 4 :
                    $type = $user['location']['country_code'];
                break;
                case 5 :
                    $type = $user['location']['city'];
                break;
            }
            $type = strtolower($type);
            $condition['value'] = strtolower($condition['value']);

            switch($condition['operator'])
            {
                case 0 :
                    if($type == $condition['value']);
                    else $failed = '1';
                break;
                case 1 :
                    if($type != $condition['value']);
                    else $failed = '1';
                break;
                case 2 :
                    if($type > $condition['value']);
                    else $failed = '1';
                break;
                case 3 :
                    if($type >= $condition['value']);
                    else $failed = '1';
                break;
                case 4 :
                    if($type < $condition['value']);
                    else $failed = '1';
                break;
                case 5 :
                    if($type <= $condition['value']);
                    else $failed = '1';
                break;
            }
        }

5 个答案:

答案 0 :(得分:1)

稍微调整一下的一种方法是确定最有可能发生的条件,并将这些选项放在if / then的顶部,这样你就不必在真正的TRUE评估发生之前就躲过了。你必须做的检查越少,显然会更快/更有效。

答案 1 :(得分:0)

case 0 :
      if($type == $condition['value']);
      else $failed = '1';
      break;

虽然从执行效率的角度来看,它不会产生任何影响,但您可能会尝试颠倒逻辑以使意图更具可读性。

case 0 :
    $success = ($type == $condition['value']);
    break;

当然,更新您的控制条件:

$success = true;   // you probably want to start off optimistic ($success is bool)
...
if($previous['route_id'] == $condition['route_id'] && $success)
...

答案 2 :(得分:0)

从本质上讲,这里有一个有限状态机(FSM)。您可能希望为规则编写解析器,该解析器创建一个网络(图形)结构,其中包含每个元素作为单个对象,连接到其他对象(即路径)。然后,每个元素都有一个(重载)函数,可以直接访问所需的参数和运算符。

您可以使用许多可以为您生成状态机的工具(谷歌),或者您可以使用自己的语言和引擎。

答案 3 :(得分:0)

如果有任何一种情况发生的可能性更大,那么你可以让它偏向于它......它至少会使它更有效率(尽管相当丑陋)。 只需我0.02美元

答案 4 :(得分:0)

我解决这个问题的方式实际上非常简单。当创建if / then规则时,PHP会自动生成一个PHP脚本,其中包含在代码中写出的所有if / then场景。然后PHP只加载该文件并执行它。很简单=)