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

我正在用 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 26


Notice: Undefined offset: 1 in C:\xampp\htdocs\****************\component\calculation.php on line 26


在这种情况下,第 26 行将是减法(进行 1-1 运算),但它发生在所有其他应该返回 0 的计算中。


我不知道它为什么会发生以及如何解决它,所以如果有人可以帮助我,那就太好了。


森栏
浏览 113回答 1
1回答

狐的传说

问题在于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);
打开App,查看更多内容
随时随地看视频慕课网APP