WC_Eval_Math::evaluate()public staticWC 1.0

Evaluate maths string.

Method of the class: WC_Eval_Math{}

No Hooks.

Return

Mixed.

Usage

$result = WC_Eval_Math::evaluate( $expr );
$expr(string) (required)
-

WC_Eval_Math::evaluate() code WC 9.4.2

public static function evaluate( $expr ) {
	self::$last_error = null;
	$expr = trim( $expr );
	if ( substr( $expr, -1, 1 ) == ';' ) {
		$expr = substr( $expr, 0, strlen( $expr ) -1 ); // strip semicolons at the end
	}
	// ===============
	// is it a variable assignment?
	if ( preg_match( '/^\s*([a-z]\w*)\s*=\s*(.+)$/', $expr, $matches ) ) {
		if ( in_array( $matches[1], self::$vb ) ) { // make sure we're not assigning to a constant
			return self::trigger( "cannot assign to constant '$matches[1]'" );
		}
		if ( ( $tmp = self::pfx( self::nfx( $matches[2] ) ) ) === false ) {
			return false; // get the result and make sure it's good
		}
		self::$v[ $matches[1] ] = $tmp; // if so, stick it in the variable array
		return self::$v[ $matches[1] ]; // and return the resulting value
		// ===============
		// is it a function assignment?
	} elseif ( preg_match( '/^\s*([a-z]\w*)\s*\(\s*([a-z]\w*(?:\s*,\s*[a-z]\w*)*)\s*\)\s*=\s*(.+)$/', $expr, $matches ) ) {
		$fnn = $matches[1]; // get the function name
		if ( in_array( $matches[1], self::$fb ) ) { // make sure it isn't built in
			return self::trigger( "cannot redefine built-in function '$matches[1]()'" );
		}
		$args = explode( ",", preg_replace( "/\s+/", "", $matches[2] ) ); // get the arguments
		if ( ( $stack = self::nfx( $matches[3] ) ) === false ) {
			return false; // see if it can be converted to postfix
		}
		$stack_size = count( $stack );
		for ( $i = 0; $i < $stack_size; $i++ ) { // freeze the state of the non-argument variables
			$token = $stack[ $i ];
			if ( preg_match( '/^[a-z]\w*$/', $token ) and ! in_array( $token, $args ) ) {
				if ( array_key_exists( $token, self::$v ) ) {
					$stack[ $i ] = self::$v[ $token ];
				} else {
					return self::trigger( "undefined variable '$token' in function definition" );
				}
			}
		}
		self::$f[ $fnn ] = array( 'args' => $args, 'func' => $stack );
		return true;
		// ===============
	} else {
		return self::pfx( self::nfx( $expr ) ); // straight up evaluation, woo
	}
}