resist/matex

PHP 数学表达式解析和评估器

此包的规范存储库似乎已消失,因此已冻结该包。

1.1.1 2023-03-22 16:54 UTC

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