@Black_Fire_2

Калькулятор возвращает неправильный результат?

Есть ㅤфункция, которaя считает число из строки.ㅤ
Проверял при помощи var_dump массив, ㅤгде хранятся числaㅤ
и мaссив где хрaнятся операторы, все на месте!ㅤㅤ

Но почему ㅤдaнная функция выводит -23, вместо 13.
Кaк решить данную проблему?

P.S.
Я намеренно не использовал eval и регулярные выражения.

function calc($value){
  
  $str_length = strlen($value);
  $str_array = [];
  $check_operators = ["+", "-", "*", "/"];
 
 
  for($a = 0; $a < $str_length; $a++){
  $str_array[] = $value[$a];
  }
 
 
  $final_array =[];
  $final_operator = [];
  $token = "";
  
  foreach($str_array as $items){       
    if ($items >= '0' && $items <= '9') {
    $token .= $items;
    } 
    else{
    array_push($final_array, $token);
    $token = '';
    }
    
    if(in_array($items, $check_operators)){ 
    $final_operator[] = $items; 
    }          
  }  
 
array_push($final_array, $token); 
   
  foreach($final_operator as $items){                   
    $result = match($items){   
      "+" => function($b, $a, $calc_array):array{   
       array_push($calc_array, $a + $b);  
       return $calc_array;
       },  
   
       "-" => function($b, $a, $calc_array):array{   
       array_push($calc_array, $a - $b);  
       return $calc_array;
       },  
    
      "*" => function($b, $a, $calc_array):array{   
      array_push($calc_array, $a * $b);  
      return $calc_array;
      },  
    
      "/" => function($b, $a, $calc_array):array{   
      array_push($calc_array, $a / $b);  
      return $calc_array;
      },
    }; 
    
  $final_array = $result(array_pop($final_array), array_pop($final_array), $final_array);         
  }
 
return array_pop($final_array);
}
 
echo calc("5+5+5+2+2+2+2-10")."<br>"; //-23?
  • Вопрос задан
  • 111 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Вы выбираете операторы слева направо (foreach), а операнды справа налево (array_pop).
Ну и в целом, ваш способ слишком примитивный. Попробуйте посчитать им 2*2+2*2.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Vitsliputsli
Для создания калькулятора самый простой и быстрый способ это перевести в обратную польскую нотацию и вычислять по ней. Это упростит парсинг в разы, и решит текущие проблемы. В том числе решит проблему разного приоритета операций.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы