我被困在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
,它就可以正常工作。
答案 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
那么可靠。
答案 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 .';');