包含变量的PHP字符串变量不会计算

时间:2012-01-29 06:44:12

标签: php string variables eval

我被困在PHP中的某些东西

    $l = $par['Length'];
    $w = $par['Width'];
    $d = $par['Depth'];
    $length = $par['Expr_1'];
    $width = $par['Expr_2'];

$par是从数据库读取的数组。 长度,宽度,深度是数字 Expr_1& Expr_2是存储为字符串的公式 即是这样的:

($l + .0625) * ($w + .125) * ($l + .125) * ($w + .0625) + 1.625

应该发生的事情是$l $w应该替换为值。如果我echo $l,$w,$d独立地拥有正确的值。如果我echo $length or $width它显示公式。

即使我尝试eval("$width = {$par['Expr_2']};");,它也不会强制计算而不是仅仅阅读公式。我知道公式是正确的,因为如果我手动将其粘贴到$length$width,它就可以正常工作。

4 个答案:

答案 0 :(得分:1)

只有当这些字符串被评估为源代码时,才会对字符串进行变量插值。当它们只是存储在变量中的值时,赋值不会进行插值。


最好是存储一个简单的可解析格式,不需要完整的eval()。这里有一些代码可以存储如下格式:

L,0.5;W,0.2;D,0.3:4.7

等同于(L+0.5)*(W+0.2)*(D+0.3)+4.7

$eqn_parts = explode(':', $input);
$add_part = $eqn_parts[1];
$mult_parts = explode(';', $eqn_parts[0]);

$accum = 1;
foreach($mult_parts as $part) {
    $bits = explode(',', $part);
    switch($bits[0]) {
        case "L":
            $accum *= ($length + (int)$bits[1]); break;
        case "W":
            $accum *= ($width + (int)$bits[1]); break;
        case "D":
            $accum *= ($depth + (int)$bits[1]); break;
    }
}
$accum += (int)$add_part;

答案 1 :(得分:1)

不是使用eval来表示公式......而是可以选择使用像preg_replace()之类的东西来代替来自数据库的那些公式变量...然后将替换结果转换/类型转换为(int)或您需要的任何数据类型。然后从那里计算公式。虽然......它可能不如eval那么可靠。

http://php.net/manual/en/function.preg-replace.php

答案 2 :(得分:0)

虽然琥珀的解决方案可行,但我想保持简单,并将我在公式中输入公式所做的所有工作都不浪费。我只是在字符串的开头组合了$ length / $ width,并且:在结尾处并对它进行了评估。

谢谢大家

编辑以添加我使用的代码:

 $l = $par['Length'];
    $w = $par['Width'];
    $d = $par['Depth'];
    $par['Expr_1'] = '$length='.$par['Expr_1'].';';
    eval($par['Expr_1']);
    $par['Expr_2'] = '$width='.$par['Expr_2'].';';
    eval($par['Expr_2']);

答案 3 :(得分:0)

假设您未事先将“任何用户提供的数据传递到其中,而未事先对其进行适当验证。”

以下似乎效果很好。

$width = $par['Expr_2'];
eval('$width = '.$width .';');