Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么不是';我的PHP计算器不工作吗?(字符串函数…)_Php_Html - Fatal编程技术网

为什么不是';我的PHP计算器不工作吗?(字符串函数…)

为什么不是';我的PHP计算器不工作吗?(字符串函数…),php,html,Php,Html,这个计算器应该在网页文本框中输入带空格的输入(如“2+2”),然后在上面回显答案。目前,输出要么是“0”,要么似乎会从输入中截取一个随机数 我95%确定问题出在substr函数中-它们没有被指定正确的值。这是我的猜测,因为输出行为。为了证明 1+1等于0 2+2等于0 ... 9+9等于0 10+10将=1 20+20将=2 注意:从第16行开始的$firstNumber、$secondNumber和$operator初始声明值是任意的 下面是PHP手册中的substr(,)示例: echo

这个计算器应该在网页文本框中输入带空格的输入(如“2+2”),然后在上面回显答案。目前,输出要么是“0”,要么似乎会从输入中截取一个随机数

我95%确定问题出在substr函数中-它们没有被指定正确的值。这是我的猜测,因为输出行为。为了证明

1+1等于0 2+2等于0 ... 9+9等于0 10+10将=1 20+20将=2

注意:从第16行开始的$firstNumber、$secondNumber和$operator初始声明值是任意的

下面是PHP手册中的substr(,)示例:

echo substr('abcdef', 1);     // bcdef   <br>
echo substr('abcdef', 1, 3);  // bcd<br>
echo substr('abcdef', 0, 4);  // abcd<br>
echo substr('abcdef', 0, 8);  // abcdef<br>
echo substr('abcdef', -1, 1); // f<br>
echo substr('abcdef',1);//bcdef
回声子序列('abcdef',1,3);//bcd
回声子序列('abcdef',0,4);//abcd
回声子序列('abcdef',0,8);//abcdef
回波子序列('abcdef',-1,1);//f
。 按下submit时执行
//if'
如果(isset($_POST['test']))
{
$input=$_POST['test'];
$answer=计算($input);
回音$答案;
}
//进行字符串处理和数字计算
函数计算($input)
{
//声明(随机)
$firstNumber=20;
$secondNumber=30;
$operator=“+”;
$answer=7;
//字符串处理。
对于($i=0;$i)

您的问题在于使用
substr

substr
获取字符串、起始位置和长度。这是您误用的长度。在平移输入字符串时,您正在增加要查找的子字符串的长度。由于运算符的长度为
1
,因此您应该使用

    //if current position of the string scan is an operator,
    if( trim(substr($input, $i, 1), " ") == "+" || trim(substr($input, $i, 1), " ") == "-"
      ||trim(substr($input, $i, 1), " ") == "*" || trim(substr($input, $i, 1), " ") == "/")
    {
         ....
您还需要在此处更新代码:

//$operator = current position TO current position + 1
$operator = substr($input, $i, 1);
//trim $operator
$operator = trim($operator, " ");
你可以通过这样做来简化这一点

  potentialOperator = trim(substr($input, $i, 1), " ")
并将其与支持的运算符进行比较。这将为您节省对
trim
substr
这也意味着你只识别一次操作员


您可能还想使用
preg_split
preg_split_DELIM_CAPTURE
来解析输入字符串,而不是逐字符扫描输入字符串。

WOW!我误用了substr-我不知道第三个参数是长度量。。谢谢!
  potentialOperator = trim(substr($input, $i, 1), " ")