Update README.md and more function support

This commit is contained in:
Bruce Wells 2019-11-27 11:39:51 -05:00
parent 44a13487b5
commit 84f3f967b7
4 changed files with 205 additions and 31 deletions

View file

@ -4,6 +4,9 @@
## Features: ## Features:
* Built in support for +, -, *, / and power (^) operators plus () * Built in support for +, -, *, / and power (^) operators plus ()
* Logical operators (==, !=, <, <, >=, <=, &&, ||)
* Built in support for most PHP math functions
* Conditional If logic
* Support for user defined operators * Support for user defined operators
* Support for user defined functions * Support for user defined functions
* Unlimited variable name lengths * Unlimited variable name lengths
@ -20,24 +23,54 @@ composer require "nxp/math-executor"
## Sample usage: ## Sample usage:
```php ```php
require "vendor/autoload.php"; require 'vendor/autoload.php';
$executor = new \NXP\MathExecutor(); $executor = new \NXP\MathExecutor();
echo $executor->execute("1 + 2 * (2 - (4+10))^2 + sin(10)"); echo $executor->execute('1 + 2 * (2 - (4+10))^2 + sin(10)');
``` ```
## Functions: ## Functions:
Default functions: Default functions:
* sin * abs
* cos
* tn
* asin
* acos * acos
* atn * acosh
* min * asin
* max * atan (atn)
* atan2
* atanh
* avg * avg
* bindec
* ceil
* cos
* cosh
* decbin
* dechex
* decoct
* deg2rad
* exp
* expm1
* floor
* fmod
* hexdec
* hypot
* if
* intdiv
* log
* log10
* log1p
* max
* min
* octdec
* pi
* pow
* rad2deg
* round
* sin
* sinh
* sqrt
* tan (tn)
* tanh
Add custom function to executor: Add custom function to executor:
```php ```php
@ -75,7 +108,7 @@ class ModulusToken extends AbstractOperator
*/ */
public function getPriority() public function getPriority()
{ {
return 3; return 180;
} }
/** /**
@ -109,6 +142,18 @@ And adding to executor:
$executor->addOperator('MyNamespace\ModulusToken'); $executor->addOperator('MyNamespace\ModulusToken');
``` ```
## Logical operators:
Logical operators (==, !=, <, <, >=, <=, &&, ||) are supported, but logically they can only return true (1) or false (0). In order to leverage them, use the built in **if** function:
```
if($a > $b, $a - $b, $b - $a)
```
You can think of the **if** function as prototyped like:
```
function if($condition, $returnIfTrue, $returnIfFalse)
```
## Variables: ## Variables:
Default variables: Default variables:
@ -161,4 +206,4 @@ Also note that you can replace an existing default operator by adding a new oper
## Future Enhancements ## Future Enhancements
At some point this package will be upgraded to a currently supported version of PHP. This package will continue to track currently supported versions of PHP. We recommend you keep PHP up-to-date. Currently the code will run under 5.6, but don't expect 5.6 support going forward.

View file

@ -4,7 +4,7 @@ namespace NXP\Classes\Token;
use NXP\Exception\IncorrectExpressionException; use NXP\Exception\IncorrectExpressionException;
class TokenUnequal extends AbstractOperator class TokenNotEqual extends AbstractOperator
{ {
/** /**
* @return string * @return string

View file

@ -267,7 +267,7 @@ class MathExecutor
'NXP\Classes\Token\TokenAnd', 'NXP\Classes\Token\TokenAnd',
'NXP\Classes\Token\TokenOr', 'NXP\Classes\Token\TokenOr',
'NXP\Classes\Token\TokenEqual', 'NXP\Classes\Token\TokenEqual',
'NXP\Classes\Token\TokenUnequal', 'NXP\Classes\Token\TokenNotEqual',
'NXP\Classes\Token\TokenGreaterThanOrEqual', 'NXP\Classes\Token\TokenGreaterThanOrEqual',
'NXP\Classes\Token\TokenGreaterThan', 'NXP\Classes\Token\TokenGreaterThan',
'NXP\Classes\Token\TokenLessThanOrEqual', 'NXP\Classes\Token\TokenLessThanOrEqual',
@ -278,33 +278,75 @@ class MathExecutor
protected function defaultFunctions() protected function defaultFunctions()
{ {
return [ return [
'sin' => function ($arg) { 'abs' => function ($arg) {
return sin($arg); return abs($arg);
},
'cos' => function ($arg) {
return cos($arg);
},
'tn' => function ($arg) {
return tan($arg);
},
'asin' => function ($arg) {
return asin($arg);
}, },
'acos' => function ($arg) { 'acos' => function ($arg) {
return acos($arg); return acos($arg);
}, },
'acosh' => function ($arg) {
return acosh($arg);
},
'asin' => function ($arg) {
return asin($arg);
},
'atan' => function ($arg) {
return atan($arg);
},
'atan2' => function ($arg1, $arg2) {
return atan2($arg1, $arg2);
},
'atanh' => function ($arg) {
return atanh($arg);
},
'atn' => function ($arg) { 'atn' => function ($arg) {
return atan($arg); return atan($arg);
}, },
'min' => function ($arg1, $arg2) {
return min($arg1, $arg2);
},
'max' => function ($arg1, $arg2) {
return max($arg1, $arg2);
},
'avg' => function ($arg1, $arg2) { 'avg' => function ($arg1, $arg2) {
return ($arg1 + $arg2) / 2; return ($arg1 + $arg2) / 2;
}, },
'bindec' => function ($arg) {
return bindec($arg);
},
'ceil' => function ($arg) {
return ceil($arg);
},
'cos' => function ($arg) {
return cos($arg);
},
'cosh' => function ($arg) {
return cosh($arg);
},
'decbin' => function ($arg) {
return decbin($arg);
},
'dechex' => function ($arg) {
return dechex($arg);
},
'decoct' => function ($arg) {
return decoct($arg);
},
'deg2rad' => function ($arg) {
return deg2rad($arg);
},
'exp' => function ($arg) {
return exp($arg);
},
'expm1' => function ($arg) {
return expm1($arg);
},
'floor' => function ($arg) {
return floor($arg);
},
'fmod' => function ($arg1, $arg2) {
return fmod($arg1, $arg2);
},
'hexdec' => function ($arg) {
return hexdec($arg);
},
'hypot' => function ($arg1, $arg2) {
return hypot($arg1, $arg2);
},
'if' => function ($expr, $trueval, $falseval) { 'if' => function ($expr, $trueval, $falseval) {
if ($expr === true || $expr === false) { if ($expr === true || $expr === false) {
$exres = $expr; $exres = $expr;
@ -316,6 +358,57 @@ class MathExecutor
} else { } else {
return $this->execute($falseval); return $this->execute($falseval);
} }
},
'intdiv' => function ($arg1, $arg2) {
return intdiv($arg1, $arg2);
},
'log' => function ($arg) {
return log($arg);
},
'log10' => function ($arg) {
return log10($arg);
},
'log1p' => function ($arg) {
return log1p($arg);
},
'max' => function ($arg1, $arg2) {
return max($arg1, $arg2);
},
'min' => function ($arg1, $arg2) {
return min($arg1, $arg2);
},
'octdec' => function ($arg) {
return octdec($arg);
},
'pi' => function () {
return pi();
},
'pow' => function ($arg1, $arg2) {
return pow($arg1, $arg2);
},
'rad2deg' => function ($arg) {
return rad2deg($arg);
},
'round' => function ($arg) {
return round($arg);
},
'sin' => function ($arg) {
return sin($arg);
},
'sinh' => function ($arg) {
return sinh($arg);
},
'sqrt' => function ($arg) {
return sqrt($arg);
},
'tan' => function ($arg) {
return tan($arg);
},
'tanh' => function ($arg) {
return tanh($arg);
},
'tn' => function ($arg) {
return tan($arg);
} }
]; ];
} }

View file

@ -50,7 +50,43 @@ class MathTest extends \PHPUnit\Framework\TestCase
['4*-5'], ['4*-5'],
['4 * -5'], ['4 * -5'],
[cos(2)], ['abs(1.5)'],
['acos(0.15)'],
['acosh(1.5)'],
['asin(0.15)'],
['atan(0.15)'],
['atan2(1.5, 3.5)'],
['atanh(0.15)'],
['bindec("10101")'],
['ceil(1.5)'],
['cos(1.5)'],
['cosh(1.5)'],
['decbin("15")'],
['dechex("15")'],
['decoct("15")'],
['deg2rad(1.5)'],
['exp(1.5)'],
['expm1(1.5)'],
['floor(1.5)'],
['fmod(1.5, 3.5)'],
['hexdec("abcdef")'],
['hypot(1.5, 3.5)'],
['intdiv(10, 2)'],
['log(1.5)'],
['log10(1.5)'],
['log1p(1.5)'],
['max(1.5, 3.5)'],
['min(1.5, 3.5)'],
['octdec(1.5)'],
['pi()'],
['pow(1.5, 3.5)'],
['rad2deg(1.5)'],
['round(1.5)'],
['sin(1.5)'],
['sinh(1.5)'],
['sqrt(1.5)'],
['tan(1.5)'],
['tanh(1.5)'],
['0.1 + 0.2'], ['0.1 + 0.2'],
['1 + 2'], ['1 + 2'],