Переменные операторы в PHP

Учитывая этот пример, как я возвратил бы результат уравнения, а не самого уравнения как строка?

$operator = '+';
foreach($resultSet as $item){
    $result = $item[$this->orderField] . $operator . 1;
    echo $result;
}
5
задан BenTheDesigner 31 March 2010 в 10:25
поделиться

5 ответов

Вы можете создавать функции, которые обертывают операторы, или для простоты просто используйте расширение bc :

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

foreach($resultSet as $item){
    $result = call_user_func($operators[$operator], $item[$this->orderField], 1);
    echo $result;
}
17
ответ дан 18 December 2019 в 05:49
поделиться

Используйте функцию 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;
}
1
ответ дан 18 December 2019 в 05:49
поделиться

Чтобы добиться именно этого, вы можете использовать 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) вам лучше использовать функции переменных (что возможно и многое другое гибкий).

7
ответ дан 18 December 2019 в 05:49
поделиться

Быстрый ответ: eval(). Тем не менее, в этом точном примере я бы просто жестко запрокодировать возможные операции:

<?php

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

?>
2
ответ дан 18 December 2019 в 05:49
поделиться

Вы можете использовать eval () , но, как правило, это плохая идея, поскольку это серьезная потенциальная дыра в безопасности (будьте осторожны » re запретить посетителям запускать произвольный код!).

Это также может привести к трудностям в сопровождении кода.

2
ответ дан 18 December 2019 в 05:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: