fork download
  1. <?php
  2.  
  3. function calculate($expression) {
  4. $numArr = preg_split('#(\\+|\\*|-|/|%)#', $expression, -1, PREG_SPLIT_DELIM_CAPTURE);
  5.  
  6. for($i = 0; count($numArr) > 1; $i++) {
  7. switch ($numArr[$i]) {
  8. case '/':
  9. $numArr[$i] = $numArr[$i - 1] / $numArr[$i + 1];
  10. unset($numArr[$i + 1]);
  11. unset($numArr[$i - 1]);
  12. $numArr = array_values($numArr);
  13. $i = 0;
  14. break;
  15.  
  16. case '*':
  17. $numArr[$i] = $numArr[$i - 1] * $numArr[$i + 1];
  18. unset($numArr[$i + 1]);
  19. unset($numArr[$i - 1]);
  20. $numArr = array_values($numArr);
  21. $i = 0;
  22. break;
  23.  
  24. case '%':
  25. $numArr[$i] = $numArr[$i - 1] % $numArr[$i + 1];
  26. unset($numArr[$i + 1]);
  27. unset($numArr[$i - 1]);
  28. $numArr = array_values($numArr);
  29. $i = 0;
  30. break;
  31.  
  32. default:
  33. break;
  34. }
  35. if(!(preg_match('#(\\*|/|%)#', implode("", $numArr)))) break;
  36. }
  37.  
  38. for($i = 0; count($numArr) > 1; $i++) {
  39. switch ($numArr[$i]) {
  40. case '+':
  41. $numArr[$i] = $numArr[$i - 1] + $numArr[$i + 1];
  42. unset($numArr[$i + 1]);
  43. unset($numArr[$i - 1]);
  44. $numArr = array_values($numArr);
  45. $i = 0;
  46. break;
  47.  
  48. case '-':
  49. $numArr[$i] = $numArr[$i - 1] - $numArr[$i + 1];
  50. unset($numArr[$i + 1]);
  51. unset($numArr[$i - 1]);
  52. $numArr = array_values($numArr);
  53. $i = 0;
  54. break;
  55.  
  56. default:
  57. break;
  58. }
  59.  
  60. if(count($numArr) == 1) {
  61. $numArr = array_values($numArr);
  62. break;
  63. }
  64. }
  65. return $numArr[0];
  66. }
  67.  
  68. echo calculate("200+100/100-2011");
Success #stdin #stdout 0.02s 24788KB
stdin
Standard input is empty
stdout
-1810