Вычисление строки как математического выражения

06.03.2013

Недавно мне понадобилось посчитать формулу, заданную в строке как математическое выражение. Т.е. скажем у нас есть какая-то формула, например: '([a]+0.5)/[b]', сначала нам надо заменить [a] и [b] на числовые значения, а потом получить результат формулы. В это статье разберем решение этого вопроса, а также подключение расширений к yii-проекту, использующих пространства имен.

01. Итак, задача

Получить результат выражения '([a]+0.5)/[b]', где [a] и [b] - какие-то числа.

$statement = '([a]+0.5)/[b]';

02. Замена [a] и [b] на значения

Для замены этих переменных в строке будем использовать PHP функцию strtr, которой передается строка и массив('подстрока'=>'на что заменить'):

$strToVal = array('[a]' => 2.5, '[b]' => 12);
$tmpStr = strtr($statement, $strToVal); // (2.5+0.5)/12

03. Подключение расширения с namespace

Для решения данной задачи я нашел расширение exprlib - библиотека для работы с выражениями, более подробно посмотрите здесь: https://github.com/rezzza/exprlib

Расширение использует неймспейсы, исходя из http://www.yiiframework.com/doc/guide/1.1/ru/extension.integration#sec-2 - "Для того чтобы подключить библиотеку, использующую пространство имён, необходимо зарегистрировать её корень как псевдоним пути".

Т.е. кладем папку /src/exprlib в extensions и делаем на неё алиас: можно сделать перед вызовом класса Parser(1) или же прописать в конфиг, в раздел aliases(2):

Yii::setPathOfAlias('exprlib',Yii::getPathOfAlias('ext.exprlib')); // (1)
или
'aliases' => array(
    'exprlib' => 'ext.exprlib', // (2)
),

04. Получение результата

Теперь выведем результат выражения:

echo exprlib\Parser::build($tmpStr)->evaluate(); // 0.25 - то что нужно!
blog comments powered by Disqus
Наверх