Only Php Code Calculator With Clickable Buttons As Input
Solution 1:
This is my truly basic, almost style-less, pure-PHP calculator form:
<!DOCTYPE html><htmllang="en"><head><metahttp-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 ($chunkas$button) {
echo"<td",(count($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>
Here is a screenshot while I was testing:
You can see that I've made every button a submit button with the same name, but different values. I use a single hidden input to preserve built expression. There will be many enhancements and considerations beyond this demo, it is up to you how far to go down this rabbit hole.
P.S. For anyone who just unholstered their sidearm, squinted one eye, and sternly uttered "Hey, we don't take kindly to folks like you callin' eval()
in these here parts!". Well, I've endeavored to adequately validate the string to be evaluated. If there is a known hole, please let me know and I'll try to fix it. Alternatively, this is my attempt to re-invent the eval()
process with BOMDAS in mind:
Code: (Demo)
$stored = "2+3*4/6";
$components = preg_split('~([*/+-])~', $stored, 0, 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
Post a Comment for "Only Php Code Calculator With Clickable Buttons As Input"