| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 | 
							- <?php
 
- namespace app\common\util;
 
- class ArithmeticCount
 
- {
 
-     protected $opArr = ['#'];
 
-     
 
-     protected $oprandArr = [];
 
-     
 
-     protected $opLevelArr = [
 
-         ')' => 2,
 
-         '(' => 3,
 
-         '+' => 4,
 
-         '-' => 4,
 
-         '*' => 5,
 
-         '/' => 5,
 
-         '#' => 1
 
-     ];
 
-     protected $bolanExprArr = [];
 
-     protected $exprLen=0;
 
-     protected $inop = false;
 
-     protected $opNums = "";
 
-     protected $expr="";
 
-     protected $bai=false;
 
-     
 
-     protected function doReplace($expr)
 
-     {
 
-         $expr = str_replace(' ','' ,$expr);
 
-         $expr = str_replace('(','(' ,$expr);
 
-         $expr = str_replace(')',')' ,$expr);
 
-         $expr = str_replace(' ','' ,$expr);
 
-         preg_match_all("/\d+(\.\d+)?%/",$expr,$arr);
 
-         if(isset($arr[0]) && !empty($arr[0])){
 
-             foreach ($arr[0] as $val){
 
-                 $expr = str_replace($val,(float) $val /100 ,$expr);
 
-             }
 
-             return $expr;
 
-         }
 
-         if(preg_match("/100-\(/",$expr,$arr)){
 
-             $expr = str_replace('100-','' ,$expr);
 
-             $this->bai = true;
 
-         }
 
-         return $expr;
 
-     }
 
-     
 
-     public  function makeCount($expr)
 
-     {
 
-         error_reporting(0);
 
-         
 
-         $this->expr = $this->doReplace($expr);
 
-         
 
-         $this->exprLen = strlen($expr);
 
-         
 
-         for($i = 0;$i <= $this->exprLen;$i++){
 
-             $char = $this->expr[$i];
 
-             
 
-             $level = intval($this->opLevelArr[$char]);
 
-             
 
-             if($level > 0){
 
-                 $this->inop = true;
 
-                 
 
-                 if($level == 3){
 
-                     array_push($this->opArr,$char);continue;
 
-                 }
 
-                 
 
-                 while($op = array_pop($this->opArr)){
 
-                     if($op){
 
-                         $currentLevel = intval($this->opLevelArr[$op]);
 
-                         if($currentLevel == 3 && $level == 2) {
 
-                             break;
 
-                         }elseif($currentLevel >= $level && $currentLevel != 3){
 
-                             array_push($this->bolanExprArr,$op);
 
-                         }else{
 
-                             array_push($this->opArr,$op);
 
-                             array_push($this->opArr,$char);
 
-                             break;
 
-                         }
 
-                     }
 
-                 }
 
-             }else{
 
-                 
 
-                 $this->opNums .= $char;
 
-                 if($this->opLevelArr[$this->expr[$i+1]] > 0){
 
-                     array_push($this->bolanExprArr, $this->opNums);
 
-                     $this->opNums = "";
 
-                 }
 
-             }
 
-         }
 
-         array_push($this->bolanExprArr, $this->opNums);
 
-         
 
-         while($leftOp = array_pop($this->opArr)){
 
-             if($leftOp != '#'){
 
-                 array_push($this->bolanExprArr,$leftOp);
 
-             }
 
-         }
 
-         
 
-         foreach($this->bolanExprArr as $v){
 
-             if(!isset($this->opLevelArr[$v])){
 
-                 array_push($this->oprandArr,$v);
 
-             }else{
 
-                 $op1 = array_pop($this->oprandArr);
 
-                 $op2 = array_pop($this->oprandArr);
 
-                 eval("\$result = $op2 $v $op1;");
 
-                 array_push($this->oprandArr,$result);
 
-             }
 
-         }
 
-         if($this->bai){
 
-             return 100 - $result;
 
-         }
 
-         return $result;
 
-     }
 
- }
 
 
  |