只有带可点击按钮作为输入的PHP代码计算器

时间:2017-07-07 10:40:17

标签: php html forms input calculator

我正在尝试使用PHP和HTML代码编写计算器。

计算器看起来应该是真实的,按钮应该是可点击的。

现在,我被困在两个数字组合中,这意味着我按一个按钮就会显示数字。但是在按下第二个按钮后,第一个值因cube2而消失。

我的问题是:如何保存值并将所有按下的按钮一起显示?

我知道我可以通过隐藏的输入做到这一点,但我不知道如何正确使用它们。

这样做之后我怎么能计算整个表达式呢?

我知道javascript或任何其他客户端语言会更好,但我想找到一种纯粹使用PHP和HTML的方法。

type="submit"

1 个答案:

答案 0 :(得分:3)

这是我真正基本的,几乎没有样式的纯PHP计算器形式:

<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Basic PHP Calculator</title>
</head>
<body>
<?php
//var_export($_POST);
//echo "<br>";
$buttons=[1,2,3,'+',4,5,6,'-',7,8,9,'*','C',0,'.','/','='];
$pressed='';
if(isset($_POST['pressed']) && in_array($_POST['pressed'],$buttons)){
    $pressed=$_POST['pressed'];
}
$stored='';
if(isset($_POST['stored']) && preg_match('~^(?:[\d.]+[*/+-]?)+$~',$_POST['stored'],$out)){
    $stored=$out[0];    
}
$display=$stored.$pressed;
//echo "$pressed & $stored & $display<br>";
if($pressed=='C'){
    $display='';
}elseif($pressed=='=' && preg_match('~^\d*\.?\d+(?:[*/+-]\d*\.?\d+)*$~',$stored)){
    $display.=eval("return $stored;");
}

echo "<form action=\"\" method=\"POST\">";
    echo "<table style=\"width:300px;border:solid thick black;\">";
        echo "<tr>";
            echo "<td colspan=\"4\">$display</td>";
        echo "</tr>";
        foreach(array_chunk($buttons,4) as $chunk){
            echo "<tr>";
                foreach($chunk as $button){
                    echo "<td",(sizeof($chunk)!=4?" colspan=\"4\"":""),"><button name=\"pressed\" value=\"$button\">$button</button></td>";
                }
            echo "</tr>";
        }
    echo "</table>";
    echo "<input type=\"hidden\" name=\"stored\" value=\"$display\">";
echo "</form>";
?>
</body>
</html>

这是我测试时的截图:

enter image description here

您可以看到我已将每个按钮设为具有相同名称但值不同的提交按钮。我使用一个隐藏的输入来保存构建的表达式。除了这个演示之外,还有很多增强功能和考虑因素,这取决于你在这个兔子洞里走多远。

P.S。对于那些刚装好他们的侧臂的人,眯着眼睛眯起眼睛,然后严厉地说出“ 嘿,我们不会像你在这些部分打电话给'eval()那样好心人! ”。好吧,我已经努力充分验证要评估的字符串。如果有一个已知的洞,请告诉我,我会尝试解决它。或者,这是我尝试用BOMDAS重新发明eval()过程:

代码:(Demo

$stored="2+3*4/6";
$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,$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);  // 4