这可能吗?
$var_1 = 1;
$var_2 = 10;
$comparison = '>';
if($var_1 $comparison $var_2) {
// do something...
}
现在的语法无效,但有没有办法做到这一点?
答案 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)
$var_1 = 1;
$var_2 = 10;
$comparison = '>=';
eval("\$b=$var_1 $comparison $var_2?1:0;");
if ($b) {
//do something
}