我正在尝试使用运算符作为变量。
$num1 = 33;
$num2 = 44;
$operator = "+";
$answer = ($num1.$operator.$num2);
打印“33 + 44”而不是77。
或者,
$operators = array(
"plus"=>"+",
"minus"=>"-",
"times"=>"*",
"div"=>"/"
);
我希望能够使用:$answer = $num1.$operators["plus"].$num2;
如何在不使用“if”语句的情况下实现此目的?
$answer = ($operator == "+") ? $num1 + $num2 : 0;
答案 0 :(得分:4)
$num1 = 33;
$num2 = 44;
$operator = "+";
eval("\$result = $num1 $operator $num2;");
echo $result;
<强>注意强> eval()语言构造非常危险,因为它允许执行任意PHP代码。因此不鼓励使用它。如果您已经仔细验证除了使用此构造之外没有其他选择,请特别注意不要将任何用户提供的数据传递到其中,而不事先正确验证它。
答案 1 :(得分:3)
在用户土地上
想想你想要达到的目标。为什么不创建固定代码闭包?您可以通过以下方式轻松完成:
$operators = array(
"plus"=>function($x, $y)
{
return $x+$y;
},
"minus"=>function($x, $y)
{
return $x-$y;
},
"times"=>function($x, $y)
{
return $x*$y;
},
"div"=>function($x, $y)
{
return $x/$y;
}
);
//in PHP 5.5:
$result = $operators['plus']($num1, $num2);
//in PHP<5.5:
//$result = call_user_func_array($operators['plus'], [$num1, $num2])
现在你有两件事:首先,它仍然是动态代码 - 你可以在表达式中使用它。接下来,您在代码评估方面是安全的 - 因为您已经自己定义了代码。这种方法也有优势 - 您可以根据需要定义所需的行为。例如,如果第二个操作数为零,则为"div"
运算符引发异常。
“轻松”的方式
我会注意到这只是为了解释为什么这不是正确的方法。你可以使用eval()
。就像:
eval('$result='.$num1.$operators['plus'].$num2.';');
然后您的结果将存储在$result
变量中。这是“简单”的方式,但不是“正确”的方式。问题是 - 它是不安全的。试想一下 - 你正在执行一些动态的代码。如果您的代码与用户输入无关,则可能适用 - 如果您之前正在检查操作数和操作符。但我仍然建议在应用之前再三考虑。
如果还需要评估
然后我建议查看一些现有的实现。以下是一些链接:
答案 2 :(得分:1)
您可以尝试使用BC Math functions。这个例子适用于PHP 5.5:
$num1 = 33;
$num2 = 44;
$operator = '+';
$funcs = array(
'+' => 'bcadd',
'-' => 'bcsub',
'/' => 'bcdiv',
'*' => 'bcmul',
);
$answer = $funcs[$operator]($num1, $num2); // 77
答案 3 :(得分:0)
我问为什么你想首先将算术运算符作为字符串传递,但这是一种不使用if语句的方法:
function fancy_math($num1 = 0, $num2 = 0, $operator = '+')
{
switch ($operator) {
case 'minus':
case '-':
return $num1 - $num2;
break;
case 'times':
case '*':
return $num1 * $num2;
break;
case 'div':
case '/':
return ($num2 !== 0) ? $num1 / $num2 : 'Error: divide by zero';
break;
default:
return $num1 + $num2;
break;
}
}
然后像这样称呼它:
$answer = fancy_math($num1, $num2, $operator);
请注意,您可以将'minus'
或'-'
(等)作为$operator
传递,因为它会同时接受这两者。如果您未传递$operator
,则会自动采用'plus'
或'+'
。