PHP中的变量运算符

PHP中的变量运算符,php,operators,Php,Operators,给出这个例子,我如何返回方程的结果,而不是作为字符串返回方程本身 $operator = '+'; foreach($resultSet as $item){ $result = $item[$this->orderField] . $operator . 1; echo $result; } 您可以使用,但这通常不是一个好主意,因为这是一个主要的潜在安全漏洞(请注意,您不允许访问者运行任意代码!) 它还可能导致代码难以维护。使用PHP的eval函数: 快速回答是eval

给出这个例子,我如何返回方程的结果,而不是作为字符串返回方程本身

$operator = '+';
foreach($resultSet as $item){
    $result = $item[$this->orderField] . $operator . 1;
    echo $result;
}
您可以使用,但这通常不是一个好主意,因为这是一个主要的潜在安全漏洞(请注意,您不允许访问者运行任意代码!)


它还可能导致代码难以维护。

使用PHP的eval函数:

快速回答是eval()。然而,在这个精确的示例中,我只需硬编码可能的操作:

<?php

$operator = '+';
foreach($resultSet as $item){
    switch($operator){
        case '+':
            $result = $item[$this->orderField] + 1;
            break;
    }
    echo $result;
}

?>

要准确地实现这一点,您可以使用
create\u函数

$operator = '+';
$func = create_function('$a,$b', "return \$a $operator \$b;");
foreach($resultSet as $item){
    $result = $func($item, 1);
    echo $result;
}
lambdas可提供更清洁的解决方案(需要php5.3)

另请参见数组求和、数组求减少

使用array_reduce和lambdas的高级示例

$ary = array(
    array('foo' => 1, 'bar' => 91),
    array('foo' => 2, 'bar' => 92),
    array('foo' => 3, 'bar' => 93),
    array('foo' => 4, 'bar' => 94),
    array('foo' => 5, 'bar' => 95),
);

$sumOfFoos = array_reduce($ary, 
    function($val, $item) { return $val + $item['foo']; } 
);
$sumOfBars = array_reduce($ary, 
    function($val, $item) { return $val + $item['bar']; } 
);

要点是,与其使用“变量运算符”(这在php中是不可能的),不如使用变量函数(这是可能的,而且更加灵活)。

您可以创建包装运算符的函数,或者为了简单起见,只需使用扩展名:

$operator = '+';
$operators = array(
  '+' => 'bcadd',
  '-' => 'bcsub',
  '*' => 'bcmul',
  '/' => 'bcdiv'
);

foreach($resultSet as $item){
    $result = call_user_func($operators[$operator], $item[$this->orderField], 1);
    echo $result;
}

什么是真正的案例导致了这个问题?我需要交换数组中的项,但要维护它们的键和值$item[$this->orderField]将是当前项,+/-1将是它将交换位置的项。我已经编写了一个数组交换函数,并结合reko_t的方法,它从数组([0]=>'0',[1]=>'1',[0]=>'0',[2]=>'2')中生成了类似于数组([0]=>'0',[1]=>'1',[2]=>'2')的东西。它将求值我的代码,但不会求值变量,这是关键的区别。但是$operator也是一个任意变量,或者您不需要创建函数(如reko_t的回答),你会吗?使用任意精度的数学库来执行常规数学?看起来有点古怪…开发时考虑到可扩展性Alvaro…谁说相同的函数可能不需要执行精度数学?在大多数情况下,这种情况下的性能是完全可以忽略不计的。有没有听说过过早优化是e万恶之源?;)编写干净、易于理解和维护的代码,必要时进行优化。
$ary = array(
    array('foo' => 1, 'bar' => 91),
    array('foo' => 2, 'bar' => 92),
    array('foo' => 3, 'bar' => 93),
    array('foo' => 4, 'bar' => 94),
    array('foo' => 5, 'bar' => 95),
);

$sumOfFoos = array_reduce($ary, 
    function($val, $item) { return $val + $item['foo']; } 
);
$sumOfBars = array_reduce($ary, 
    function($val, $item) { return $val + $item['bar']; } 
);
$operator = '+';
$operators = array(
  '+' => 'bcadd',
  '-' => 'bcsub',
  '*' => 'bcmul',
  '/' => 'bcdiv'
);

foreach($resultSet as $item){
    $result = call_user_func($operators[$operator], $item[$this->orderField], 1);
    echo $result;
}