{$accessor}(); break; } } if ($op) { $function = 'filter' . ucfirst(strtolower($op)); if (method_exists(static::class, $function)) { $value = static::$function($value); } } return $value; } public static function filterLower($str) { return mb_strtolower($str); } public static function filterUpper($str) { return mb_strtoupper($str); } public static function filterLength($str) { return mb_strlen($str); } public static function filterLtrim($str) { return ltrim($str); } public static function filterRtrim($str) { return rtrim($str); } public static function filterTrim($str) { return trim($str); } /** * Helper for sorting arrays of objects based on multiple fields + orientations. * * @param string $name * @param int $orientation * @param \Closure $next * * @return \Closure */ public static function sortByField($name, $orientation = 1, \Closure $next = null) { if (!$next) { $next = function() { return 0; }; } return function ($a, $b) use ($name, $next, $orientation) { $aValue = static::getObjectFieldValue($a, $name); $bValue = static::getObjectFieldValue($b, $name); if ($aValue === $bValue) { return $next($a, $b); } return (($aValue > $bValue) ? 1 : -1) * $orientation; }; } /** * {@inheritDoc} */ public function walkComparison(Comparison $comparison) { $field = $comparison->getField(); $value = $comparison->getValue()->getValue(); // shortcut for walkValue() switch ($comparison->getOperator()) { case Comparison::EQ: return function ($object) use ($field, $value) { return static::getObjectFieldValue($object, $field) === $value; }; case Comparison::NEQ: return function ($object) use ($field, $value) { return static::getObjectFieldValue($object, $field) !== $value; }; case Comparison::LT: return function ($object) use ($field, $value) { return static::getObjectFieldValue($object, $field) < $value; }; case Comparison::LTE: return function ($object) use ($field, $value) { return static::getObjectFieldValue($object, $field) <= $value; }; case Comparison::GT: return function ($object) use ($field, $value) { return static::getObjectFieldValue($object, $field) > $value; }; case Comparison::GTE: return function ($object) use ($field, $value) { return static::getObjectFieldValue($object, $field) >= $value; }; case Comparison::IN: return function ($object) use ($field, $value) { return \in_array(static::getObjectFieldValue($object, $field), $value, true); }; case Comparison::NIN: return function ($object) use ($field, $value) { return !\in_array(static::getObjectFieldValue($object, $field), $value, true); }; case Comparison::CONTAINS: return function ($object) use ($field, $value) { return false !== strpos(static::getObjectFieldValue($object, $field), $value); }; case Comparison::MEMBER_OF: return function ($object) use ($field, $value) { $fieldValues = static::getObjectFieldValue($object, $field); if (!is_array($fieldValues)) { $fieldValues = iterator_to_array($fieldValues); } return \in_array($value, $fieldValues, true); }; case Comparison::STARTS_WITH: return function ($object) use ($field, $value) { return 0 === strpos(static::getObjectFieldValue($object, $field), $value); }; case Comparison::ENDS_WITH: return function ($object) use ($field, $value) { return $value === substr(static::getObjectFieldValue($object, $field), -strlen($value)); }; default: throw new \RuntimeException("Unknown comparison operator: " . $comparison->getOperator()); } } }