avadim/math-executor

此包已被废弃,不再维护。作者建议使用 avadim/ace-calculator 包代替。

具有自定义操作符、函数和变量的数学表达式计算器

v1.2.1 2018-01-08 13:41 UTC

This package is auto-updated.

Last update: 2021-04-29 15:18:39 UTC


README

License Latest Stable Version

具有自定义操作符、函数和变量的数学表达式计算器

此包不再支持!请使用 AceCalculator 代替! https://github.com/aVadim483/ace-calculator

通过 Composer 安装

|$ composer require avadim/math-executor

所有安装说明请见: https://packagist.org.cn/packages/avadim/math-executor

示例用法

require 'vendor/autoload.php';

$calculator = new \avadim\MathExecutor\MathExecutor();

print $calculator->execute('1 + 2 * (2 - (4+10))^2 + sin(10)');

// cascade execution - variable $_ has result of previous calculation
print $calculator
        ->calc('4+10')
        ->calc('1 + 2 * (2 - $_)^2')
        ->calc('$_ + sin(10)')
        ->getResult();

默认操作符和函数

默认操作符: + - * / ^

默认函数

  • sin
  • cos
  • tn
  • asin
  • acos
  • atn
  • min
  • max
  • avg

变量

默认变量

$pi = 3.14159265359
$e = 2.71828182846

您可以将自己的变量添加到执行器中

$calculator->setVars([
    'var1' => 0.15,
    'var2' => 0.22
]);

$calculator->execute('$var1 + $var2');

额外操作符和函数

要加载额外操作符和函数,请使用方法 loadExtra()

$calculator->loadExtra();

额外操作符是布尔操作符: < <= > >= == != 您可以使用布尔操作符与函数 if() 结合使用

print $calculator->execute('if(100+20+3 > 111, 23, 34)');

自定义函数

向执行器添加自定义函数

$calculator->addFunction('hypotenuse', function($a, $b) {
    return sqrt($a ** 2 + $b ** 2);
}, 2);

print $calculator->execute('hypotenuse(3,4)');

自定义操作符

向执行器添加自定义操作符

<?php
use avadim\MathExecutor\Generic\AbstractToken;
use avadim\MathExecutor\Generic\AbstractTokenOperator;
use avadim\MathExecutor\Token\TokenScalarNumber;

class TokenOperatorModulus extends AbstractTokenOperator
{
    protected static $pattern = 'mod';

    /**
     * Priority of this operator (1 equals "+" or "-", 2 equals "*" or "/", 3 equals "^")
     * @return int
     */
    public function getPriority()
    {
        return 3;
    }

    /**
     * Association of this operator (self::LEFT_ASSOC or self::RIGHT_ASSOC)
     * @return string
     */
    public function getAssociation()
    {
        return self::LEFT_ASSOC;
    }

    /**
     * Execution of this operator
     * @param AbstractToken[] $stack Stack of tokens
     *
     * @return TokenScalarNumber
     */
    public function execute(&$stack)
    {
        $op2 = array_pop($stack);
        $op1 = array_pop($stack);
        $result = $op1->getValue() % $op2->getValue();

        return new TokenScalarNumber($result);
    }
}

并将其添加到执行器中

$calculator = new avadim\MathExecutor\MathExecutor();
$calculator->addOperator('mod', '\TokenOperatorModulus');
echo $calculator->execute('286 mod 100');

标识符的解释

标识符 - 以字母开头,由字母和数字的序列组成。您可以在计算中指定如何解释它们的规则

$calculator->setIdentifiers([
    'ONE' => 1,
    'YEAR' => function($variables, $identifiers) { return date('Y'); },
]);

$calculator->execute('YEAR + ONE');