protected static function evaluate(&$oprs, &$expr, $subExpr = false, $returnAsArray = false) { $o = array('or', 'and'); $o2 = array('not', 'or', 'and', '(', ')'); // not if (count($oprs) > 0 && $oprs[count($oprs) - 1] == 'not') { if (count($expr) > 0 && !in_array($expr[count($expr) - 1], $o2)) { array_pop($oprs); if ($returnAsArray) { array_pop($expr); } else { $expr[] = 'not ' . array_pop($expr); } SJB_BooleanEvaluator::evaluate($oprs, $expr, $subExpr, $returnAsArray); return; } } // and, or if (count($expr) > 1 && in_array($oprs[count($oprs) - 1], $o)) { if (!in_array($expr[count($expr) - 1], $o2) && !in_array($expr[count($expr) - 2], $o2)) { $opr = array_pop($oprs); $val1 = array_pop($expr); $val2 = array_pop($expr); if ($returnAsArray) { if (!is_array($val2)) { $val2 = array($val2); } if (!is_array($val1)) { $val1 = array($val1); } $expr[] = array_merge($val2, $val1); } else { switch ($opr) { case "or": $expr[] = "({$val2} or {$val1})"; break; case "and": $expr[] = "({$val2} and {$val1})"; break; } } SJB_BooleanEvaluator::evaluate($oprs, $expr, $subExpr, $returnAsArray); return; } } if (count($oprs) == 0 && $expr > 0) { $oprs[] = 'and'; SJB_BooleanEvaluator::evaluate($oprs, $expr, $subExpr, $returnAsArray); } if ($subExpr) { if (count($oprs > 0) && $oprs[count($oprs) - 1] == "(") { if (count($expr) > 1 && $expr[count($expr) - 2] == "(") { array_pop($oprs); $e = array_pop($expr); array_pop($expr); $expr[] = $e; return; } if (count($expr) > 0 && $expr[count($expr) - 1] != "(") { $oprs[] = 'and'; SJB_BooleanEvaluator::evaluate($oprs, $expr, $subExpr, $returnAsArray); } else { array_pop($oprs); array_pop($expr); SJB_BooleanEvaluator::evaluate($oprs, $expr, $subExpr, $returnAsArray); } } } }