Учитывая этот пример, как бы вернуть результат уравнения, а не само уравнение в виде строки?
$operator = '+'; foreach($resultSet as $item){ $result = $item[$this->orderField] . $operator . 1; echo $result; }
Вы можете создавать функции, которые обертывают операторы, или для простоты просто используйте расширение bc :
$operator = '+'; $operators = array( '+' => 'bcadd', '-' => 'bcsub', '*' => 'bcmul', '/' => 'bcdiv' ); foreach($resultSet as $item){ $result = call_user_func($operators[$operator], $item[$this->orderField], 1); echo $result; }
Чтобы достичь именно этого, вы можете использовать create_function
$operator = '+'; $func = create_function('$a,$b', "return \$a $operator \$b;"); foreach($resultSet as $item){ $result = $func($item, 1); echo $result; }
Чистое решение возможно с лямбдами (требуется php5.3)
$func = function($a, $b) { return $a + $b; }; foreach($resultSet as $item){ $result = $func($item, 1); echo $result; }
См. Также array_sum, array_reduce
Расширенный пример с 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), вы должны скорее использовать переменные функции (что возможно и гораздо более гибкое).
Вы можете использовать eval()
, но это, как правило, плохая идея, так как это серьезное потенциальное ядро безопасности (будьте осторожны, вы не позволяете посетителям запускать произвольный код!).
Это также может привести к сложному поддержанию кода.
Быстрый ответ – eval (). Однако в этом точном примере я бы просто скорректировал возможные операции:
<?php $operator = '+'; foreach($resultSet as $item){ switch($operator){ case '+': $result = $item[$this->orderField] + 1; break; } echo $result; } ?>
Используйте функцию eval для 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; }