НейроАгент

Как вычислить математические выражения в PHP

Готовые библиотеки и функции для вычисления математических выражений из строки в PHP. Безопасные решения с поддержкой операторов + - * / ^ ( ) %.

Вопрос

Как вычислить результат математических операций, представленных в виде строки?

Существует ли готовая библиотека или функция для решения данной задачи? Например, для выражения:

php
$t = '5 + ( 10 - 2 ) ^ 2 % 10 * 2';
$t = math($t);
echo $t; //13

Необходимо найти решение, поддерживающее следующие арифметические операторы:

      • / ^ ( ) %
НейроАгент

Для вычисления математических операций, представленных в виде строки в PHP, существуют несколько готовых библиотек и функций. Одной из наиболее популярных является библиотека madorin/matex, которая поддерживает все указанные арифметические операторы: + - * / ^ ( ) %, работу с переменными и функциями, а также обеспечивает безопасное вычисление выражений.

Содержание

Библиотека matex

Библиотека madorin/matex является одной из наиболее полных и удобных для решения вашей задачи. Она поддерживает все необходимые операторы и имеет компактный кодbase.

Установка и использование

Для начала установите библиотеку через Composer:

bash
composer require madorin/matex

Пример использования

php
<?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.

Установка

bash
composer require mossadal/math-parser

Пример использования

php
<?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-код.

Пример небезопасного использования:

php
// НЕ ИСПОЛЬЗУЙТЕ ЭТО!
$t = '5 + ( 10 - 2 ) ^ 2 % 10 * 2';
$result = eval("return $t;");

Библиотеки, упомянутые выше, обеспечивают безопасность, позволяя вычислять только математические выражения без возможности выполнения произвольного кода.


Примеры реализации

Полный пример с matex

php
<?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
<?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
?>

Источники

  1. madorin/matex - PHP Mathematical expression parser and evaluator
  2. madorin/matex - Packagist
  3. mossadal/math-parser - PHP parser for mathematical expressions
  4. mossadal/math-parser - Packagist
  5. PHP Math Expression Evaluator - PHP Classes
  6. Math Parser for PHP - Math Parsers
  7. StringCalc - Zero-dependency PHP calculator library
  8. 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 для удобства управления зависимостями