resist / matex
PHP 数学表达式解析和评估器
此包的规范存储库似乎已消失,因此已冻结该包。
Requires
- php: >=8.1
Requires (Dev)
- phpunit/phpunit: ^9.5
This package is auto-updated.
Last update: 2023-03-22 16:56:27 UTC
README
PHP 数学表达式解析和评估器
此存储库是原始 Matex 的分支
https://github.com/madorin/matex
Dorin Marcoci - dorin.marcoci@gmail.com - https://www.marcodor.com
安装
composer require resist/matex
变更日志
更改
- 添加了 Composer 和 Packagist 支持
- 添加了新的命名空间:
resist\Matex\Evaluator
- 添加了对负数的适当支持:感谢 https://github.com/blazer82/matex/
- 添加了自定义
MatexException
- PHP 版本要求提升到 7.4
- 添加了单元测试
- 重新格式化代码
下面的原始 README 和 MANUAL
Matex
Matex 是一个 PHP 数学表达式解析和评估器库。
它允许安全地执行和计算任意表达式。
安装
Matex 可以通过 Composer 包管理器或手动连接到您的项目进行安装。
Composer 方式
请确保已安装 Composer 并正确配置了您的项目以使用 Composer 工具。
在控制台中执行以下代码以连接 Matex 库
$ composer require madorin/matex
它将通过将 Matex 库添加为依赖项来调整您的项目的 composer.json 文件。请检查 Composer 的 /vendor/autoload.php
是否包含/要求在您的项目中。
手动方式
下载 Matex 包并将其解压到您的项目库文件夹中。如果您使用自定义 php 自动加载器,位于 /src/
文件夹中的类是 PSR-4 兼容的,因此可以调整自动加载器配置或根据您的规则移动文件夹。
对于完整的手动链接方式,请将 src/Evaluator.php
包含到您的项目中
<?php require 'path/to/matex/src/Evaluator.php';
功能
- 快速评估
- 紧凑的代码库
- 运算符:+ - * / ^ %
- 括号,嵌套,无限级别
- 变量:预定义或动态估计
- 函数:预定义或动态连接
- 函数中的字符串参数,如 field("name")
- 字符串操作,目前支持连接
示例
基本
$evaluator = new \Matex\Evaluator(); echo $evaluator->execute('1 + 2');
字符串连接
$evaluator = new \Matex\Evaluator(); echo $evaluator->execute('"String" + " " + "concatenation"');
变量
$evaluator = new \Matex\Evaluator(); $evaluator->variables = [ 'a' => 1, 'b' => 2 ]; echo $evaluator->execute('a + b');
动态变量
public function doVariable($name, &$value) { switch ($name) { case 'b': $value = 2; break; } } $evaluator = new \Matex\Evaluator(); $evaluator->variables = [ 'a' => 1 ]; $evaluator->onVariable = [$this, 'doVariable']; echo $evaluator->execute('a + b');
函数
static function sum($arguments) { $result = 0; foreach ($arguments as $argument) $result += $argument; return $result; } $evaluator = new \Matex\Evaluator(); $evaluator->functions = [ 'sum' => ['ref' => '\\Space\\Class::sum', 'arc' => null] ]; echo $evaluator->execute('sum(1, 2, 3)');
特别篇
/* Dynamic variable resolver Invoked when the variable is not found in the cache Returns the value by name */ public function doVariable($name, &$value) { switch ($name) { case 'zen': // Here may be a database request, or a function call $value = 999; break; case 'hit': $value = 666; break; } } /* Dynamic function resolver Invoked when the function is not found in the cache Returns an associative array array with: ref - Function reference arc - Expected argument count */ public function doFunction($name, &$value) { switch ($name) { case 'cos': // Map to a system function $value = ['ref' => 'cos', 'arc' => 1]; break; case 'minadd': // Map to a public object instance function $value = ['ref' => [$this, 'minAdd'], 'arc' => 2]; break; } } /* Custom functions, may be a - Built-in function - Global defined function - Static class function - Object instance function */ static function sum($arguments) { $result = 0; foreach ($arguments as $argument) $result += $argument; return $result; } // Just a sample custom function function minAdd($a, $b) { $r = $a < 2 ? 2 : $a; return $r + $b; } // Let's do some calculations $evaluator = new \Matex\Evaluator(); $evaluator->variables = [ 'a' => 1, 'bet' => -10.59, 'pi' => 3.141592653589 ]; $evaluator->onVariable = [$this, 'doVariable']; $evaluator->functions = [ 'sin' => ['ref' => 'sin', 'arc' => 1], 'max' => ['ref' => 'max', 'arc' => null], 'sum' => ['ref' => '\\Space\\Class::sum', 'arc' => null] ]; $evaluator->onFunction = [$this, 'doFunction']; echo $evaluator->execute('a + MinAdd(PI * sin(zen), cos(-1.7 / pi)) / bet ^ ((A + 2) * 2) + sum(5, 4, max(6, hit))');
作者
Dorin Marcoci - dorin.marcoci@gmail.com - https://www.marcodor.com
许可
Matex遵循MIT许可证发布。有关更多详细信息,请参阅LICENSE.md。