在条件中动态选择比较运算符(> =,< =等)?

时间:2010-12-13 20:13:15

标签: php

if (foo >= bar) baz();

但是,有时候说baz();需要在foo <= barfoo == bar ...时运行...让我们说这个比较运算符是从db表中获取的,并放入变量:$param = ">="。< / p>

除了带有多个if语句的switch-case之外,还有什么办法可以修改第一行使用$param吗?

在我的代码中,baz();跨越了大量的行,如果我手工管理它,将成为组织的噩梦。

4 个答案:

答案 0 :(得分:9)

function lt($a, $b)
{
  return $a < $b;
}

 ...

$relops = Array(
  '<' => 'lt',
   ...
);

echo $relops['<'](2, 3);

答案 1 :(得分:3)

我用以下方法解决了这个问题:

function doComparison($a, $operator, $b)
{
    switch ($operator) {
        case '<':  return ($a <  $b); break;
        case '<=': return ($a <= $b); break;
        case '=':  return ($a == $b); break; // SQL way
        case '==': return ($a == $b); break;
        case '!=': return ($a != $b); break;
        case '>=': return ($a >= $b); break;
        case '>':  return ($a >  $b); break;
    }

    throw new Exception("The {$operator} operator does not exists", 1);
}

答案 2 :(得分:1)

使用eval()

$param = ">=";
eval ("if (foo $param bar ) baz();");

在eval功能的文档页面上阅读更多内容。

编辑:

事实上,正如其他人所提到的,如果有其他选择,它们几乎总是优于eval()。如果使用,必须小心使用。

答案 3 :(得分:0)

详细说明我的评论:

function variableOpComparison($v1, $v2, $o) {
    if ($o == '!=') return ($v1 != $v2); // could put this elsewhere...
    $operators = str_split($o);
    foreach($operators as $operator) {
        switch ($operator) { // return will exit switch, foreach loop, function
            case '>': if ($v1 > $v2) return true; else continue; break;
            case '<': if ($v1 < $v2) return true; else continue; break;
            case '=': if ($v1 == $v2) return true; else continue; break;
            default: throw new Exception('Unrecognized operator ' . $operator . ' in ' . $o);
        }
    }
    return false;
}
相关问题