Given this example, how would I return the result of the equation rather than the equation itself as a string?
$operator = '+';
f开发者_运维技巧oreach($resultSet as $item){
$result = $item[$this->orderField] . $operator . 1;
echo $result;
}
You could make functions that wrap the operators, or for simplicity just use the bc extension:
$operator = '+';
$operators = array(
'+' => 'bcadd',
'-' => 'bcsub',
'*' => 'bcmul',
'/' => 'bcdiv'
);
foreach($resultSet as $item){
$result = call_user_func($operators[$operator], $item[$this->orderField], 1);
echo $result;
}
To achieve exactly that, you can use create_function
$operator = '+';
$func = create_function('$a,$b', "return \$a $operator \$b;");
foreach($resultSet as $item){
$result = $func($item, 1);
echo $result;
}
A cleaner solution is possible with lambdas (php5.3 required)
$func = function($a, $b) { return $a + $b; };
foreach($resultSet as $item){
$result = $func($item, 1);
echo $result;
}
See also array_sum, array_reduce
Advanced example with array_reduce and 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']; }
);
The main point is, that instead of 'variable operators' (which is not possible in php), you should rather use variable functions (which is possible and much more flexible).
You can use eval()
, but it's generally a bad idea, since it's a major potential security hole (be careful you're not allowing visitors to run arbitrary code!).
It can also result in hard to maintain code.
Quick answer is eval(). However, in this precise example I would just hard-code the possible operations:
<?php
$operator = '+';
foreach($resultSet as $item){
switch($operator){
case '+':
$result = $item[$this->orderField] + 1;
break;
}
echo $result;
}
?>
Use the eval function of PHP: http://php.net/manual/en/function.eval.php
$operator = '+';
foreach($resultSet as $item){
$result = $item[$this->orderField] . $operator . 1;
eval("\$result = \"$result\";");
echo $result;
}
精彩评论