执行存储在变量中的数学运算

时间:2009-01-27 10:08:42

标签: php

我有3个这样的变量: $ first = 2; $ second = 5; $ operation ='*';

如何以编程方式将此数学问题的解决方案分配给$ answer变量? 我尝试过eval(),但这不起作用。

4 个答案:

答案 0 :(得分:7)

eval()应该可以很好地完成这样的事情。请记住,eval()会返回NULL,除非你告诉它返回一些东西。

<?php
$first = 3;
$second = 4;
$operation = "*";

$answer = eval('return '.$first.$operation.$second.';');

echo $answer;
?>

答案 1 :(得分:5)

function add($a, $b) {
    return $a + $b;
}

function multiply($a, $b) {
    return $a * $b;
}

function divide($a, $b) {
    return $a / $b;
}

$operations = array(
    '+' => 'add',
    '*' => 'multiply',
    '/' => 'divide',
);

$a = 2;
$b = 5;
$operation = '*';

echo $operations[$operation]($a, $b);

答案 2 :(得分:1)

它适用于我:

var_dump(eval("return $first $operator $second;"));

但是eval是邪恶的。你应该更好地使用这样的函数:

function foobar($operator)
{
    $args = func_get_args();
    array_shift($args);
    switch ($operator) {
    case "*":
        if (count($args) < 1) {
            return false;
        }
        $result = array_shift($args) * array_shift($args);
        break;
    /*
        …
    */
    }
    if (count($args)) {
        return call_user_func_array(__FUNCTION__, array_merge(array($operator, $result), $args));
    }
    return $result;
}
var_dump(foobar("*", 3, 5, 7));

答案 3 :(得分:1)

如果您打算经常进行此计算,我强烈建议您不要使用eval方法,而是使用上面发布的Ionut G. Stan方法。我知道它更复杂,但每次运行eval时,PHP都会重新加载编译器引擎,因此开销成本很高。如果你使用函数调度方法Ionut显示,你将获得一个主要的性能提升(大约10倍)。看看PHP手册中有关eval函数的注释,你会看到其他人也这样说过:http://www.php.net/eval

我曾经使用eval希望它能让我为Web应用程序构建一个快速模板机制,但是对eval的调用非常慢,当我意识到eval导致它时,我转向了另一种方法。速度提升非常惊人。