为了账号安全,请及时绑定邮箱和手机立即绑定

PHP计算器:答案为0时未定义溢出

PHP计算器:答案为0时未定义溢出

PHP
森栏 2022-01-14 16:09:00
我正在用 JS 创建一个计算器,但计算是用 PHP 进行的。计算器必须能够在不使用 eval() 或类似技巧的情况下处理超过 1 个运算符(例如 1+2*3-4/5)。经过大量搜索,我最终得到了这个:if (isset($_POST)) {    $equation = $_POST["textview"];}$stored = $equation;$components = preg_split('~([*/%+-])~', $stored, NULL, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);while (($index = array_search('*', $components)) !== false) {    array_splice($components, $index - 1, 3, $components[$index - 1] * $components[$index + 1]);}while (($index = array_search('/', $components)) !== false) {    array_splice($components, $index - 1, 3, $components[$index - 1] / $components[$index + 1]);}while (($index = array_search('%', $components)) !== false) {    array_splice($components, $index - 1, 3, fmod($components[$index - 1], $components[$index + 1]));}while (($index = array_search('+', $components)) !== false) {    array_splice($components, $index - 1, 3, $components[$index - 1] + $components[$index + 1]);}while (($index = array_search('-', $components)) !== false) {    array_splice($components, $index - 1, 3, $components[$index - 1] - $components[$index + 1]);}echo current($components);它似乎工作得很好,除了一个问题:当计算结果为 0 时,它给了我一个错误,并且没有结束“while”循环Notice: Undefined offset: -1 in C:\xampp\htdocs\***************\component\calculation.php on line 26Notice: Undefined offset: 1 in C:\xampp\htdocs\****************\component\calculation.php on line 26在这种情况下,第 26 行将是减法(进行 1-1 运算),但它发生在所有其他应该返回 0 的计算中。我不知道它为什么会发生以及如何解决它,所以如果有人可以帮助我,那就太好了。
查看完整描述

1 回答

?
狐的传说

TA贡献1804条经验 获得超3个赞

问题在于array_search()执行松散的比较。当 的元素$components是数字时,它会将搜索字符串转换为数字,然后再进行比较。看起来不像数字的字符串被转换为0,因此array_search("-", [0])返回0而不是false(try var_dump('-' == 0, '-' === 0))。


array_search有一个可选strict参数,使其进行严格比较(如===而不是==)。将此添加到所有array_search调用中可以解决问题。


$stored = "1-1";

$components = preg_split('~([*/%+-])~', $stored, NULL, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);

while (($index = array_search('*', $components, true)) !== false) {

    array_splice($components, $index - 1, 3, $components[$index - 1] * $components[$index + 1]);

}

while (($index = array_search('/', $components, true)) !== false) {

    array_splice($components, $index - 1, 3, $components[$index - 1] / $components[$index + 1]);

}

while (($index = array_search('%', $components, true)) !== false) {

    array_splice($components, $index - 1, 3, fmod($components[$index - 1], $components[$index + 1]));

}

while (($index = array_search('+', $components, true)) !== false) {

    array_splice($components, $index - 1, 3, $components[$index - 1] + $components[$index + 1]);

}

while (($index = array_search('-', $components, true)) !== false) {

    array_splice($components, $index - 1, 3, $components[$index - 1] - $components[$index + 1]);

}


echo current($components);


查看完整回答
反对 回复 2022-01-14
  • 1 回答
  • 0 关注
  • 112 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信