最早想到的方式就是一个很简单的加减乘除,其实没那么简单。分析表达式的运算符与数字这些都必须先想好每一步。 最开始我的解决方法是用系统函数eval,但是有些时候eval函数会被禁止掉.就丢掉这个解决方案,谷歌了一下发现前辈早有很好的解决方案,就是用后缀表
最早想到的方式就是一个很简单的加减乘除,其实没那么简单。分析表达式的运算符与数字这些都必须先想好每一步。
最开始我的解决方法是用系统函数eval,但是有些时候eval函数会被禁止掉.就丢掉这个解决方案,谷歌了一下发现前辈早有很好的解决方案,就是用后缀表达式(逆波兰式)来运算,关于逆波兰式的算法,可以自己找一些资料。我直接贴出运算代码:
header("Content-type:text/html;charset=utf-8"); function deleteHtml($str) { $str = trim($str); $str = strip_tags($str, ""); $str = ereg_replace("\t", "", $str); $str = ereg_replace("\r\n", "", $str); $str = ereg_replace("\r", "", $str); $str = ereg_replace("\n", "", $str); $str = ereg_replace(" ", "", $str); return trim($str); } /* * 将中缀表达式转换成后缀表达式 * 也就是逆波兰式 */ class math_rpn { private $expression = array(); //需要转换的中缀表达式 private $rpnexp = array(); //处理后的逆波兰式 private $stack = array('#'); //储存临时运算符栈 private $priority = array('#'=>0, '('=>10, '+' => 20, '-'=>20, '*'=>30, '/'=>30); //运算符优先级 private $operator = array('(', '+', '-', '*', '/', ')'); //四则运算符 public function __construct($expression) { $this->_init($expression); } private function get_token_array($string) { /* 构造记号流*/ $token = array(); $str_len = 0; while (true) { if (1 === preg_match('/^([%,\\^\\+\\-\\*\\/\\(\\)]).*$/',$string,$sub)) { array_push($token,$sub[1]); $string = substr($string,strlen($sub[1])); $str_len += strlen($sub[1]); continue; } elseif (1 === preg_match('/^(([0-9]+[\\.]?[0-9]*)|([0-9]*[\\.]?[0-9]+)).*$/',$string,$sub)) { array_push($token,floatval($sub[1])); $string = substr($string,strlen($sub[1])); $str_len += strlen($sub[1]); continue; } elseif (1 === preg_match('/^([a-zA-Z_][0-9a-zA-Z_]*\\().*$/',$string,$sub)) { array_push($token,$sub[1]); $string = substr($string,strlen($sub[1])); $str_len += strlen($sub[1]); continue; } elseif (1 === preg_match('/^(\\s+).*$/',$string,$sub)) { $string = substr($string,strlen($sub[1])); $str_len += strlen($sub[1]); continue; } else { break; } } if ($string != '') { return $str_len; } return $token; } private function _init($expression) { $exp = array(); $expression = deleteHtml($expression); $exp = $this->get_token_array($expression); if(!is_array($exp)) { $str = substr($expression, $exp,1); echo $expression,'表达式错误在',$str; exit; } $this->expression = $exp; } public function exp2rpn() { $count = count($this->expression); for($i = 0; $iexpression[$i]; //获取表达式中的每一个字符串 if ($char == '(') //如果字符为(,则直接存入$stack的栈顶 { $this->stack[] = $char; continue; } else if (!in_array($char, $this->operator)) //如果字符不为运算符,则压入$rpnexp中 { $this->rpnexp[] = $char; continue; } else if ($char == ')') //在$stack中查找最近"("之间的运算符,逐个出栈.送入栈$rpnexp中 { for ($j =count($this->stack); $j >= 0; $j++) { $tmp = array_pop($this->stack); if ($tmp == '(') //跳出循环 break; else $this->rpnexp[] = $tmp; } continue; } else if ($this->priority[$char] priority[end($this->stack)]) { $this->rpnexp[] = array_pop($this->stack); $this->stack[] = $char; continue; } else { $this->stack[] = $char; continue; } } //将存在临时的运算符栈剩余的内容存入rpnexp栈中 for($i=count($this->stack); $i>=0; $i++) { if(end($this->stack) == '#') break; else $this->rpnexp[] = array_pop($this->stack); } return $this->rpnexp; } public function getResult($rpnexp) { $result = array(); $rpnexp = array_reverse($rpnexp); //将值倒叙 $count = count($rpnexp); //如果有运算符就计算,否则将数据压入$result结果栈中 while($count>0) { $v = array_pop($rpnexp); if(in_array($v, $this->operator)) { $a = array_pop($result); $b = array_pop($result); switch($v) { case '+': array_push($result, ($a+$b)); break; case '-': array_push($result, ($b-$a)); break; case '*': array_push($result, ($a*$b)); break; case '/': array_push($result, ($b/$a)); break; default: break; } } else array_push($result, $v); $count--; } return array_pop($result); } } $exp = "(30+3.1)*5/2-2"; $mathrpn = new math_rpn($exp); $rpnExp = $mathrpn->exp2rpn(); echo $mathrpn->getResult($rpnExp);//80.75 ?>
原文地址:PHP 计算器, 感谢原作者分享。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SublimeText3漢化版
中文版,非常好用

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),