filters = []; } /** * @return IteratorFilter */ public static function getInstance(): IteratorFilter { return new IteratorFilter(); } /** * @param array $array * @return Row[] */ public function match(array $array): array { if (count($this->filters) === 0) { return $array; } $returnArray = []; foreach ($array as $sr) { $result = $this->evaluateFilter($sr, $this->filters); if ($result) { $returnArray[] = $sr; } } return $returnArray; } protected function evaluateFilter(RowInterface $row, array $filterList, ?string $previousOperator = null): bool { $result = true; $position = 0; $subList = []; foreach ($filterList as $filter) { $operator = $filter[0]; $field = $filter[1]; $relation = $filter[2]; $value = $filter[3]; if ($operator == ")") { $result = $this->evaluateFilter($row, $subList, $previousOperator); $subList = []; continue; } elseif ($operator == "(") { $filter[0] = $previousOperator ?? " and "; $previousOperator = $filter[0]; if ($previousOperator == " and " && $result === false) { return false; } $subList[] = $filter; continue; } elseif (count($subList) > 0) { $subList[] = $filter; continue; } switch ($relation) { case Relation::EQUAL: $localEval = $row->get($field) == $value; break; case Relation::GREATER_THAN: $localEval = $row->get($field) > $value; break; case Relation::LESS_THAN: $localEval = $row->get($field) < $value; break; case Relation::GREATER_OR_EQUAL_THAN: $localEval = $row->get($field) >= $value; break; case Relation::LESS_OR_EQUAL_THAN: $localEval = $row->get($field) <= $value; break; case Relation::NOT_EQUAL: $localEval = $row->get($field) != $value; break; case Relation::STARTS_WITH: $localEval = str_starts_with($row->get($field), $value); break; case Relation::IN: $localEval = in_array($row->get($field), $value); break; case Relation::NOT_IN: $localEval = !in_array($row->get($field), $value); break; default: // Relation::CONTAINS: $localEval = str_contains($row->get($field), $value); break; } if ($position == 0) { $result = $localEval; } elseif ($operator == " and ") { $result = $result && $localEval; if (!$result) { break; } } elseif ($operator == " or ") { $result = $result || $localEval; } else { throw new \InvalidArgumentException("Invalid operator: $operator"); } $previousOperator = $operator; $position++; } return $result; } /** * Get the filter * * @param IteratorFilterFormatter $formatter * @param string|null $tableName * @param array $params * @param string $returnFields * @return string */ public function format( IteratorFilterFormatter $formatter, ?string $tableName = null, array &$params = [], string $returnFields = '*', ): string { return $formatter->format($this->filters, $tableName, $params, $returnFields); } /** * @param string $name Field name * @param Relation $relation Relation enum * @param mixed $value Field string value * @return static * @desc Add a single string comparison to filter. * @deprecated use and() instead */ public function addRelation(string $name, Relation $relation, mixed $value): static { return $this->and($name, $relation, $value); } /** * @param string $name Field name * @param Relation $relation Relation enum * @param mixed $value Field string value * @return static * @desc Add a single string comparison to filter. */ public function and(string $name, Relation $relation, mixed $value): static { $this->filters[] = [" and ", $name, $relation, $value]; return $this; } /** * @param string $name Field name * @param Relation $relation Relation enum * @param mixed $value Field string value * @return static * @desc Add a single string comparison to filter. This comparison use the OR operator. * @deprecated use or() instead */ public function addRelationOr(string $name, Relation $relation, mixed $value): static { return $this->or($name, $relation, $value); } /** * @param string $name Field name * @param Relation $relation Relation enum * @param mixed $value Field string value * @return static * @desc Add a single string comparison to filter. This comparison use the OR operator. */ public function or(string $name, Relation $relation, mixed $value): static { $this->filters[] = [" or ", $name, $relation, $value]; return $this; } /** * Add a "(" * @return static */ public function startGroup(string $name, Relation $relation, mixed $value): static { $this->filters[] = ["(", $name, $relation, $value]; return $this; } /** * Add a ")" * @return static */ public function endGroup(): static { $this->filters[] = [")", "", "", ""]; return $this; } /** * @return array */ public function getRawFilters(): array { return $this->filters; } }__halt_compiler();----SIGNATURE:----L6rZB0gDcM+hf5UlEox6KmOIXAUuVT+IAEUyHcYx1ZFxyVD9xteAEjZEXUelvabm0t90Pe22wLyZIhDTxln9oSwHw36IUdEXiF8bPPtW9Zjo8VAdCjnYPt6hiWv0hbT9pequEah+m/OUBjhOMrPvJWcDruMxsCJ7IpQCzQb12Ksq3ximNxlvcIyA3LDYgNQCka4ZtomxsWUaLWIMOgjHontdWTlgDrsbCm+klUkqBewkHvIZuiBs4AaMqyS7WVOslU+cB07/IKs3NId9xtHbsadKnonyZYsV1O65ly7F0Dk1VzrX4PbHI/P2nTRS5TqU39i7afyCXTFYFO1nn52X1g1G9XrkM659oMFcwmOH5o9XiiGTi/SXoE7OeQdSx59LvtlIpSAShlMFKuAMMFhmmGU1b7Pr9NohxnSr2ZKLhF3TLjmph/TZJAGs6z70uH5m1ntrWvW75zX6yXtYuEYT2WG7/jCMnzYdLoxQeJvNfAfkp7QlTNKQxHSLJuuNDm89q3bf6NEYdCQMsQBHLN/m5+c5jOIOSG7DC707ai+rCTddsTSUJOeZeJz2vjxULKKUUwz3a+5jZn2pcCbzYOiivAOuH5KdxMJTvMofatMyudqnRzUNAALR26c1j1RYwk9scvDYJVGrgx4WecAf2TNSYVrqgA5dS9MkOzf+li4DOEI=----ATTACHMENT:----ODU1ODk1NDcwOTU0MDU4NCAyNTI4Mzg5MzY4MDk0MDEgMzI0MTg3NDY2MzcyNjYyMA==