Example #1
0
 /**
  * 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];
 }