Как вычислить результат математических операций, представленных в виде строки?
Существует ли готовая библиотека или функция для решения данной задачи? Например, для выражения:
$t = '5 + ( 10 - 2 ) ^ 2 % 10 * 2';
$t = math($t);
echo $t; //13
Необходимо найти решение, поддерживающее следующие арифметические операторы:
-
-
- / ^ ( ) %
-
Для вычисления математических операций, представленных в виде строки в PHP, существуют несколько готовых библиотек и функций. Одной из наиболее популярных является библиотека madorin/matex, которая поддерживает все указанные арифметические операторы: + - * / ^ ( ) %, работу с переменными и функциями, а также обеспечивает безопасное вычисление выражений.
Содержание
- Библиотека matex
- Библиотека mossadal/math-parser
- Другие решения
- Безопасное использование
- Примеры реализации
Библиотека matex
Библиотека madorin/matex является одной из наиболее полных и удобных для решения вашей задачи. Она поддерживает все необходимые операторы и имеет компактный кодbase.
Установка и использование
Для начала установите библиотеку через Composer:
composer require madorin/matex
Пример использования
<?php
require 'vendor/autoload.php';
use Matex\Evaluator;
$evaluator = new Evaluator();
$evaluator->variables = []; // можно определить переменные заранее
$result = $evaluator->execute('5 + ( 10 - 2 ) ^ 2 % 10 * 2');
echo $result; // выведет 13
?>
Основные возможности
- Поддержка операторов:
+ - * / ^ % - Поддержка скобок: вложенных, без ограничения уровней
- Работа с переменными: предопределенными или динамическими
- Поддержка функций: предопределенных или пользовательских
- Быстрое вычисление
- Компактный кодbase
Как указано в документации библиотеки, она идеально подходит для вашей задачи и обеспечивает безопасное вычисление выражений.
Библиотека mossadal/math-parser
Еще одним отличным решением является библиотека mossadal/math-parser, которая предоставляет парсер и вычислитель математических выражений на PHP.
Установка
composer require mossadal/math-parser
Пример использования
<?php
require 'vendor/autoload.php';
use MathParser\StdMathParser;
use MathParser\Interpreters\Evaluator;
$parser = new StdMathParser();
$AST = $parser->parse('5 + ( 10 - 2 ) ^ 2 % 10 * 2');
$evaluator = new Evaluator();
$value = $AST->accept($evaluator);
echo $value; // 13
?>
Особенности библиотеки
Как отмечено в официальном описании, эта библиотека:
- Предназначена для безопасного и эффективного вычисления пользовательских формул
- Поддерживает базовую арифметику и элементарные функции
- Работает с переменными и дополнительными функциями
- Производит абстрактное синтаксическое дерево (AST)
- Имеет три интерпретатора: вычислитель, дифференциатор и упрощатель
Другие решения
PHP Classes Math Expression Evaluator
На PHP Classes существует класс для парсинга и вычисления строк с математическими выражениями. Его можно расширять для обработки новых операций.
StringCalc
Библиотека StringCalc является калькулятором с нулевыми зависимостями для математических выражений, передаваемых в виде строк.
Функция evaluate_math_string
На GitHub существует простая функция для вычисления математических строк без дополнительных зависимостей.
Безопасное использование
При работе с пользовательскими математическими выражениями важно учитывать безопасность. Стандартная функция eval() PHP небезопасна, так как позволяет выполнять произвольный PHP-код.
Пример небезопасного использования:
// НЕ ИСПОЛЬЗУЙТЕ ЭТО!
$t = '5 + ( 10 - 2 ) ^ 2 % 10 * 2';
$result = eval("return $t;");
Библиотеки, упомянутые выше, обеспечивают безопасность, позволяя вычислять только математические выражения без возможности выполнения произвольного кода.
Примеры реализации
Полный пример с matex
<?php
require 'vendor/autoload.php';
use Matex\Evaluator;
function math($expression) {
$evaluator = new Evaluator();
return $evaluator->execute($expression);
}
// Использование
$t = '5 + ( 10 - 2 ) ^ 2 % 10 * 2';
$t = math($t);
echo $t; // 13
// Другие примеры
echo math('2 ^ 3 + 4 * 5'); // 28
echo math('(10 + 5) % 7'); // 1
echo math('100 / (2 + 3)'); // 20
?>
Пример с mossadal/math-parser
<?php
require 'vendor/autoload.php';
use MathParser\StdMathParser;
use MathParser\Interpreters\Evaluator;
function math($expression) {
$parser = new StdMathParser();
$AST = $parser->parse($expression);
$evaluator = new Evaluator();
return $AST->accept($evaluator);
}
$t = '5 + ( 10 - 2 ) ^ 2 % 10 * 2';
echo math($t); // 13
?>
Источники
- madorin/matex - PHP Mathematical expression parser and evaluator
- madorin/matex - Packagist
- mossadal/math-parser - PHP parser for mathematical expressions
- mossadal/math-parser - Packagist
- PHP Math Expression Evaluator - PHP Classes
- Math Parser for PHP - Math Parsers
- StringCalc - Zero-dependency PHP calculator library
- evaluate_math_string - Simple PHP function
Заключение
- Для вычисления математических выражений из строки в PHP существует несколько готовых библиотек, наиболее популярные из которых -
matexиmossadal/math-parser - Библиотека
matexобеспечивает поддержку всех необходимых операторов (+ - * / ^ ( ) %) и имеет компактный кодbase - Библиотека
mossadal/math-parserсоздает абстрактное синтаксическое дерево и предоставляет дополнительные возможности для математических операций - Использование специализированных библиотек предпочтительнее, чем встроенная функция
eval(), так как обеспечивает безопасность - Для решения вашей задачи с выражением
'5 + ( 10 - 2 ) ^ 2 % 10 * 2'любая из упомянутых библиотек вернет правильный результат - 13 - Рекомендуется устанавливать библиотеки через Composer для удобства управления зависимостями