if语句的构建条件比较

时间:2011-06-02 14:20:11

标签: php dynamic comparison if-statement

这可能吗?

$var_1 = 1;
$var_2 = 10;
$comparison = '>';

if($var_1 $comparison $var_2) {
    // do something...
}

现在的语法无效,但有没有办法做到这一点?

6 个答案:

答案 0 :(得分:9)

非本地(当然除了eval)。您需要自己评估各种表达方式。构建包装函数并使用switch语句。或者对于非表达式比较,可以使用简单的地图:

$var_1 = 1;
$var_2 = 10;
$comparison = '>';

$map = array(
    ">" => $var_1 > $var_2,
    "<" => $var_1 < $var_2,
    "==" => $var_1 == $var_2,
    "!=" => $var_1 != $var_2,
);

if($map[$comparison]) {
    // do something...
}

答案 1 :(得分:5)

可以使用

if (eval("{$var_1} {$comparison} {$var_2}")) {

但强烈建议不要使用eval,所以只有在你无法达到预期效果的情况下才这样做

修改 正如@mario所说,直到PHP 5.3,这不起作用。在5.3中它确实如此。所以对于旧版本,它应该是

if (eval("return {$var_1} {$comparison} {$var_2};")) {

答案 2 :(得分:3)

您可能应该使用eval()。与其他编程语言一样,PHP的eval()也很强大且危险 - 小心。

如果您编写类似以下代码的内容:

if (eval("$var_1 $comparison $var_2")) {
    // ...
}

它无效。因为PHP的eval() 不评估表达式 ,但只执行语句 。所以你应该这样做:

eval("\$condition = $var_1 $comparison $var_2;"); // semicolon required!
if ($condition) {
    // ...
}

除非$var_1$var_2不是数字,否则效果会很好。例如,如果$var_1'hello'之类的字符串,则代码eval()会执行:

eval("\$condition = hello > 2;");

为避免破坏此代码,您应该转义$var_1$var_2的美元符号:

eval("\$condition = \$var_1 $comparison \$var_2;"); // don't escape $comparison's.

答案 3 :(得分:0)

如果没有使用eval声明,我不确定这是否可行。你当然可以简单地测试在另一个if语句中使用的比较。

if($comparison == '>' && $var_1 > $var_2)
    //Do something
elseif($comparison == '<' && $var_1 < $var_2)
    //Do something, and so on

如果将代码构建为字符串,则eval方法也应该有效。

if(eval("$var_1 $comparison $var_2")) //Do something

但第一种方法可能更为可取。

答案 4 :(得分:0)

您还可以创建一些函数,如isGreaterThan($ arg1,$ arg2),isLessThan($ arg1,$ arg2),然后在变量$ comparison中存储所需函数的名称。然后,当您想要使用它时,您将使用call_user_func_array()。像这样:

function isGreaterThan($val1, $val2) {
    return $val1 > $val2;
}

/////////////

$var_1 = 1;
$var_2 = 10;
$comparison = "isGreaterThan";

if(call_user_func_array($comparison, array($var_1, var_2))) {
    //do something
}

听起来你有几个选择。希望这会有所帮助。

答案 5 :(得分:0)

使字符串成为条件字符串,如果为true或false则返回值

简短形式if语句

$var_1 = 1;
$var_2 = 10;
$comparison = '>=';

eval("\$b=$var_1 $comparison $var_2?1:0;");

if ($b) {
//do something
}