我目前正在构建一个内部工具,供我们的管理层用来控制流量。我已经构建了一个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;
}
}
答案 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只加载该文件并执行它。很简单=)