/** * Takes a RPN logical expression and evaluates it as true or false * * @static * @param string $expr RPN expression * @param array $vars variables lookup table * @return bool evaluation */ public static function evaluate_rpn_expression($expr, $vars) { // Operators $unary = array(SC_Survey_Flow::LO_NOT); $binary = array(SC_Survey_Flow::LO_AND, SC_Survey_Flow::LO_OR); //Split expression into tokens $tokens = SC_Survey_Flow::tokenise($expr); $tokens = array_map(function ($val) { return str_replace(SC_Survey_Flow::LITERAL, '', $val); }, $tokens); //print_r($tokens); $stack = []; $loop = 1; foreach ($tokens as $t) { if (in_array($t, $unary)) { //Token is a unary operator $r = array_pop($stack); $result = SC_Survey_Flow::evaluate_unary_logic($r, $t); $stack[] = $result; } elseif (in_array($t, $binary)) { //Token is a binary operator $r1 = array_pop($stack); $r2 = array_pop($stack); $result = SC_Survey_Flow::evaluate_binary_logic($r1, $r2, $t); $stack[] = $result; } else { //Token is a condition $result = SC_Survey_Flow::evaluate_condition($t, $vars); //echo 'token: '.$t.' === '.($result ? 'TRUE' : 'FALSE').'<br />'; $stack[] = $result; } $loop++; } return $stack[0]; }