运算符作为PHP中的变量

时间:2013-07-20 03:20:06

标签: php math

我试图在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;

}

3 个答案:

答案 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代码。因此不鼓励使用它。如果您已经仔细验证除了使用此构造之外没有其他选择,请特别注意不要将任何用户提供的数据传递到其中,而不事先正确验证它。