我正在尝试使用PHP和HTML代码编写计算器。
计算器看起来应该是真实的,按钮应该是可点击的。
现在,我被困在两个数字组合中,这意味着我按一个按钮就会显示数字。但是在按下第二个按钮后,第一个值因cube2
而消失。
我的问题是:如何保存值并将所有按下的按钮一起显示?
我知道我可以通过隐藏的输入做到这一点,但我不知道如何正确使用它们。
这样做之后我怎么能计算整个表达式呢?
我知道javascript或任何其他客户端语言会更好,但我想找到一种纯粹使用PHP和HTML的方法。
type="submit"
答案 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>
这是我测试时的截图:
您可以看到我已将每个按钮设为具有相同名称但值不同的提交按钮。我使用一个隐藏的输入来保存构建的表达式。除了这个演示之外,还有很多增强功能和考虑因素,这取决于你在这个兔子洞里走多远。
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