0

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

}
4

3 回答 3

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()做同样的事情。

于 2013-07-20T03:26:07.547 回答
2

5.3 的答案很好,但是,为什么不预先计算 $qty_price +-* $operator_value 而不是重复整个函数呢?它会使代码更具可读性...

例如

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;

}
于 2013-07-20T03:30:42.520 回答
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 代码。因此不鼓励使用它。如果您已仔细验证除了使用此构造之外别无选择,请特别注意不要将任何用户提供的数据传入其中,而无需事先正确验证。

于 2013-07-20T03:29:40.033 回答