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;
}