Механизм расчета формул для веба - PullRequest
1 голос
/ 10 сентября 2010

Существует группа простых формул для вычисления некоторых значений. Мне нужно реализовать это для веб-интерфейса (я делаю это на PHP).

Для хранения формул я использую простой формат, такой как: «X1 + X2 + X3». Когда мне нужно выполнить вычисления, я вызываю функцию preg_replace в цикле для замены X1, X2 .. реальными данными (введенными пользователем или сохраненными ранее - это не важно) Затем я использую функцию eval ('$ computing_result ='. $ Trans_formula. ';'), Где $ trans_formula хранит текст формулы с замещенными данными.

Этот механизм выглядит как примитив, и у меня есть ощущение, что я пытаюсь заново изобрести колесо. Возможно, есть какие-то готовые алгоритмы, методики, методы для этого? Не нужно PHP-код. Я ценю даже простое описание алгоритма.

Ответы [ 3 ]

3 голосов
/ 10 сентября 2010

Первая мысль, которая меня поразила: eval - это плохо!

Как бы я подошел к этой проблеме:
1. Я бы сохранил формулу в postfix (польская запись) 2Затем я бы написал простую программу для оценки выражения.Довольно просто написать постфиксный оценщик.

Этот подход также позволит вам при необходимости проверять такие вещи, как типы данных значений и ограничения диапазона.Также устраняет огромный риск eval .

Cheers!


РЕДАКТИРОВАТЬ в ответ на ваш комментарий к вопросу:

Если ваши пользователибудут вводить свои собственные выражения, вы также захотите преобразовать их в постфикс. Проверьте преобразование из инфикса в постфикс .

2 голосов
/ 10 сентября 2010

Взгляните на класс evalMath в PHPClasses.

0 голосов
/ 10 сентября 2010

Если формулы предопределены, как я предполагаю, читая ваш вопрос, бесполезно (лучше, это опасно) использовать eval для их оценки.

Создайте простую функцию и вызовите их, передав соответствующие параметры(после проверки ввода).

Например, ваш пример будет:

<?php
  function sumOfThree($x1, $x2, $x3) {
    return $x1+$x2+$x3;
  }

// and you can call it as usual:
$calculation_result = sumOfThree($first, $second, $third);
?>

Вы получите много плюсов в

  • скорость: eval очень медленен для выполнения (дажедля простых функций);
  • отладка: вы можете отлаживать свою функцию (и получать правильные сообщения об ошибках);
  • безопасность: Eval легко использовать.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...