Reputation: 1984
Given this example, how would I return the result of the equation rather than the equation itself as a string?
$operator = '+';
foreach($resultSet as $item){
$result = $item[$this->orderField] . $operator . 1;
echo $result;
}
Upvotes: 5
Views: 5636
Reputation: 56430
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;
}
Upvotes: 17
Reputation: 53940
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).
Upvotes: 7
Reputation: 146460
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;
}
?>
Upvotes: 2
Reputation: 2923
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;
}
Upvotes: 1
Reputation: 55291
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.
Upvotes: 2