gpt4 book ai didi

php - 在 php 中处理数学方程式

转载 作者:可可西里 更新时间:2023-11-01 12:30:03 24 4
gpt4 key购买 nike

允许用户输入他们喜欢的任何数学方程式(带有一个变量):

x + 5

1 - x/2

(x/3) * (56/13)

这些在数据库中存储为字符串。检索到它们后,我需要用“x”代替数字并检查等式的值。

我该怎么做?

我正在考虑编写一个解析器来解构字符串并将它们转换为方程式,但这听起来很昂贵且存在问题。另一种选择是通过 eval 传递它们(但如果可以的话,我不太喜欢使用 eval)。

有什么想法吗?

更新:我还需要能够获得诸如“(x > 5)”之类的 bool 值。这对于 evalMath 是不可能的

更新 2:我需要一秒钟发射很多这些东西。我一直在研究 php 中的 eval,但无法让它返回 (5 > 4) 的 bool 值,但我注意到 js 会这样做...也许我应该研究 node.js...

更新 3:在试用了 node.js(并使其开始工作)后获得了一些乐趣后,我返回并在 PHP 中使用了 eval,请参阅:Can php eval return a boolean value?

所以我将使用 eval 对用户输入进行非常非常严格的过滤器。

最佳答案

这个问题出现时我的标准答案是:

不要使用 eval(尤其是当您声明这是用户输入时)或通过编写您自己的公式解析器来重新发明轮子。

看看 evalMath PHPClasses 上的类。它应该执行您在此处列出的所有操作。

编辑

回复:不幸的是 evalMath 不处理像 (x > 5) 这样的事情

将第 177-179 行更改为

$ops   = array('+', '-', '*', '/', '^', '_', '>', '<', '=');
$ops_r = array('+'=>0,'-'=>0,'*'=>0,'/'=>0,'^'=>0, '>' => 0, '<' => 0, '=' => 0); // right-associative operator?
$ops_p = array('+'=>0,'-'=>0,'*'=>1,'/'=>1,'_'=>1,'^'=>2, '>' => 0, '<' => 0, '=' => 0); // operator precedence

将第 184 行更改为

if (preg_match("/[^\w\s+*^\/()\.,-<>=]/", $expr, $matches)) { // make sure the characters are all good

添加

case '>':
$stack->push($op1 > $op2); break;
case '<':
$stack->push($op1 < $op2); break;
case '=':
$stack->push($op1 == $op2); break;

321行之后

evalMath 现在将处理 (x > 5)、(x < 5) 或 (x = 5)

// instantiate a new EvalMath
$m = new EvalMath;
$m->suppress_errors = true;
// set the value of x
$m->evaluate('x = 3');
var_dump($m->evaluate('y = (x > 5)'));

进一步编辑

遗漏的第 307 行应修改为:

if (in_array($token, array('+', '-', '*', '/', '^', '>', '<', '='))) {

关于php - 在 php 中处理数学方程式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4019418/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com