您好我已经尝试使用PHP开发RPN计算器,并且在程序中的某个时刻,数字1突然出现在我的数组中。我用调试器检查了程序3次,我不明白从哪里来它来自。这是我的代码:
if(isset($_GET["send"])){
$v0 = $_GET["val0"];
$a = explode(" ", $v0);
$second_array = array();
function operatii($v , $second_array){
$var1 = array_pop($second_array);
$var2 = array_pop($second_array);
$rez = null;
switch ($v){
case '+':
$rez = $var1 + $var2;
break;
case '-':
$rez = $var2 - $var1;
break;
case '*':
$rez = $var1 * $var2;
break;
case '/':
$rez = $var2 / $var1;
break;
}
array_push($second_array, $rez);
print_r($second_array);
echo '<br/>';
}
for($i = 0; $i < count($a); $i++){
if($a[$i] === "+" || $a[$i] === "-" || $a[$i] === "*" || $a[$i] === "/" ){
operatii($a[$i] , $second_array);
continue;
}else{
array_push($second_array, $a[$i]);
}
}
}
?>
<form method="get" action="">
<input type="text" value="<?php ?>" name="val1" disabled/>
<input type="text" value="" name="val0" />
<input type="submit" value="Introdu" name="send"/>
</form>
长话短说这个表格将采用类似于5 1 - 5 +的表达式并执行此操作5 - 1 + 5.
问题出现在for循环运行两次并且operatii()方法运行它的序列之后,在方法结束时$ rez变量被推入$ second_array。在此之后,方法结束并且在operatii方法和下一个循环迭代1的开始之间进行,并将其添加到$ second_array中。
正如我之前提到的,我运行了3次调试器,我找不到任何合理的解释,为什么以及从哪个地方添加到数组中。任何人都可以告诉我们发生了什么以及如何纠正它? / p>
答案 0 :(得分:2)
错误在于您将$ second_array作为值传递,而不是作为引用传递。这意味着数组被复制,并且您在operatii函数中所做的任何更改都不会影响函数之外的second_array。要做的是改变
function operatii($v , $second_array){
到
function operatii($v , &$second_array){
有关该主题的更多信息:
答案 1 :(得分:1)
您的数组缺少&
,您也可以将运算符保存在数组中
if (isset($_GET["send"])) {
$_GET["val0"] = isset($_GET["val0"]) ? $_GET["val0"] : "";
$a = explode(" ", $_GET["val0"]);
$second_array = array();
function operatii($v, &$second_array) {
$var1 = array_pop($second_array);
$var2 = array_pop($second_array);
$rez = null;
switch ($v) {
case '+' :
$rez = $var1 + $var2;
break;
case '-' :
$rez = $var2 - $var1;
break;
case '*' :
$rez = $var1 * $var2;
break;
case '/' :
$rez = $var2 / $var1;
break;
}
array_push($second_array, $rez);
print_r($second_array);
echo '<br/>';
}
$oprators = array("+","-","*","/");
for($i = 0; $i < count($a); $i ++) {
if (in_array($a[$i], $oprators)) {
operatii($a[$i], $second_array);
continue;
} else {
array_push($second_array, $a[$i]);
}
}
}