我试图在PHP中计算一个简单的表达式,表达式将始终与运算符中唯一的变化相同。
是否有一个简单的解决方案而不是复制公式,只需使用单个表达式并将运算符作为变量。
像...这样的东西。
function calc($qty, $qty_price, $max_qty, $operator_value, $operator = '-')
{
$operators = array(
'+' => '+',
'-' => '-',
'*' => '*',
);
//adjust the qty if max is too large
$fmq = ($max_qty > $qty)? $qty : $max_qty ;
return ( ($qty_price . $operators[$operator] . $operator_value) * $fmq ) + ($qty - $fmq) * $qty_price;
}
答案 0 :(得分:2)
如果你使用5.3+,那么只需使用函数作为运算符值:
$operators = array(
'+' => function (a,b) { return a+b; },
'-' => function (a,b) { return a-b; },
'*' => function (a,b) { return a*b; },
);
$fmq = ($max_qty > $qty)? $qty : $max_qty ;
return ( $operators[$operator]($qty_price, $operator_value) * $fmq ) + ($qty - $fmq) * $qty_price;
如果您正在使用< 5.3然后你可以使用create_function()
做同样的事情。
答案 1 :(得分:2)
5.3答案很好,但是,为什么不预先计算$ qty_price + - * $ operator_value而不是重复整个函数?它使代码更具可读性......
E.g。
function calc($qty, $qty_price, $max_qty, $operator_value, $operator = '-')
{
$qty_price_orig = $qty_price;
switch($operator) {
case '-':
$qty_price -= $operator_value;
break;
case '+':
$qty_price += $operator_value;
break;
case '*':
$qty_price = $qty_price * $operator_value;
break;
//adjust the qty i max is too large
$fmq = ($max_qty > $qty)? $qty : $max_qty ;
return ( $qty_price * $fmq ) + ($qty - $fmq) * $qty_price_orig;
}
答案 2 :(得分:0)
如果您想使用eval()
来完成工作:
<?php
$operators = array(
'+' => '+',
'-' => '-',
'*' => '*',
);
$a = 3;
$b = 4;
foreach ($operators as $op) {
$expr = "$a ".$op." $b";
eval("\$result=".$expr.";");
print_r($expr." = ".$result."\n");
}
?>
但是,请谨慎使用!这是官方警告:
eval()语言构造非常危险,因为它允许执行任意PHP代码。因此不鼓励使用它。如果您已经仔细验证除了使用此构造之外没有其他选择,请特别注意不要将任何用户提供的数据传递到其中,而不事先正确验证它。