如何使用保存在变量中的运算符符号执行操作[重复]
Posted
技术标签:
【中文标题】如何使用保存在变量中的运算符符号执行操作[重复]【英文标题】:how to perform operations with operator symbol saved in a variable [duplicate] 【发布时间】:2013-03-04 05:58:11 【问题描述】:伙计们,这对你们大多数人来说可能是一个简单的问题。但我对如何使用保存在变量中的运算符符号执行操作感到困惑。例子。
$first=5;
$second=5;
$operator="+";
$result=$first.$operator.$second;
echo $result;
但是 $result 只会打印 5+5。我希望它执行操作。
我的想法是将所有操作放在一个 if 条件中 -> if($operator == '+')添加第一个和第二个操作数。大家还有什么想法吗?
【问题讨论】:
你必须使用eval()
。这通常表明你应该做一些不同的事情。我建议审查您的策略。
您能详细说明一下吗?以及为什么您不发布答案?呵呵
【参考方案1】:
您可以尝试使用带有switch()
的自定义函数,而不是使用eval()
:
$first = 5;
$second = 3;
$operator = '+';
$result = mathOp($operator, $first, $second);
echo $result;
function mathOp($operator, $n1, $n2)
if(!is_numeric($n1) || !is_numeric($n2))
return 'Error: You must use numbers';
switch($operator)
case '+':
return($n1 + $n2);
case '-':
return($n1 - $n2);
case '*':
return($n1 * $n2);
case '/':
if($n2 == 0)
return 'Error: Division by zero';
else
return($n1 / $n2);
default:
return 'Unknown Operator detected';
【讨论】:
+1 检查数值。不错且简单的答案,具有更高的安全性。【参考方案2】:你必须使用eval()
来执行php操作。
$first=5;
$second=5;
$operator="+";
$term = $first.$operator.$second;
eval("$result = " . $term);
echo $result;
但要小心 eval 它会执行每个 PHP 函数。 (甚至执行..)
【讨论】:
为了额外的安全性,您可以检查 $first 和 $second are integer 并检查 $operator 是否是有效的运算符if(in_array($operator, array('+', '-', '*', '/', '%')))
然后执行 eval 函数【参考方案3】:
Eval 是一种解决方案,但还有其他解决方案。如果你搜索数学解析器,你会发现很多答案。 This one 就是一个很好的例子。
因此,基本上,您的选择是:eval()
首先进行一些验证,或者为您执行此操作的自定义数学解析器,例如 evalMath。
如果您只寻找简单的操作(+、-、*、/)和两个运算符,请对参数使用验证函数(仅限数字,仅限已知运算符)并使用 eval。如果您希望能够解析复杂的操作(括号、变量...),请使用解析器。
【讨论】:
【参考方案4】:当你使用自己的语法时,你离自己的语法不远了
$first.$operator.$second;
您实际上是将字符串添加在一起,您需要使用“+”运算符才能成功使用您的方法。请参阅下面的代码,经过尝试和测试
$first = 5;
$second = 5;
$operator = '+';
$result = $first+$operator+$second;
echo $result;
?>
【讨论】:
您在这里所做的只是像往常一样添加两个变量。让我解释一下:$result = $first+$operator+$second;
PHP 检查 $first 的值是 5,然后 PHP 检查 $operator 的值,但是哎呀它是一个字符串,所以 PHP 将它转换为一个数字 0 echo intval('+');
,然后 PHP检查 $second 是否为 5,因此等式变为 5+0+5 = 10。例如,如果您执行 $operator = '*';
,它将始终返回 10。以上是关于如何使用保存在变量中的运算符符号执行操作[重复]的主要内容,如果未能解决你的问题,请参考以下文章