See More

$array * @param array $needles */ public static function containsAll(array $array, array $needles, bool $strict): bool { return ArrayValueSetOps::containsAll($array, $needles, $strict); } /** * @param array $array * @param array $needles */ public static function containsAny(array $array, array $needles, bool $strict): bool { return ArrayValueSetOps::containsAny($array, $needles, $strict); } /** * @param array $array * @param array $values * @return array */ public static function diff(array $array, array $values, bool $strict): array { return ArrayValueSetOps::diff($array, $values, $strict); } /** * @param array $array * @return array */ public static function duplicates(array $array, bool $strict): array { return ArrayValueSetOps::duplicates($array, $strict); } /** * Build a comparable fingerprint for a value. */ public static function fingerprint(mixed $value, bool $strict = true): string { return ArrayValueSetOps::fingerprint($value, $strict); } /** * @param array $array * @param array $values * @return array */ public static function intersect(array $array, array $values, bool $strict): array { return ArrayValueSetOps::intersect($array, $values, $strict); } /** * @param array $array */ public static function max(array $array): float|int|null { return self::selectNumeric($array, pickMax: true); } /** * @param array $array */ public static function maxBy(array $array, callable $callback): mixed { return self::pickBy($array, $callback, pickMax: true); } /** * @param array $array */ public static function min(array $array): float|int|null { return self::selectNumeric($array, pickMax: false); } /** * @param array $array */ public static function minBy(array $array, callable $callback): mixed { return self::pickBy($array, $callback, pickMax: false); } /** * Convert numeric input without discarding integer precision. */ public static function numericValue(mixed $value): float|int|null { if (is_int($value) || is_float($value)) { return $value; } if (is_string($value) && is_numeric($value)) { return $value + 0; } return null; } /** * @param array $left * @param array $right */ public static function same(array $left, array $right, bool $strict): bool { return ArrayValueSetOps::same($left, $right, $strict); } /** * @param array $left * @param array $right * @return array */ public static function symmetricDiff(array $left, array $right, bool $strict): array { return array_values([ ...self::diff($left, $right, $strict), ...self::diff($right, $left, $strict), ]); } /** * @param array $array * @return array */ public static function unique(array $array, bool $strict): array { return ArrayValueSetOps::unique($array, $strict); } /** * @param array $array * @return array */ public static function where(array $array, ?callable $callback): array { $results = []; if ($callback === null) { foreach ($array as $key => $value) { if ((bool) $value) { $results[$key] = $value; } } return $results; } foreach ($array as $key => $value) { if ((bool) self::invokeValueCallback($callback, $value, $key)) { $results[$key] = $value; } } return $results; } private static function invokeValueCallback(callable $callback, mixed $value, int|string $key): mixed { return $callback($value, $key); } /** * @param array $array */ private static function pickBy(array $array, callable $callback, bool $pickMax): mixed { $best = null; $bestScore = null; $found = false; foreach ($array as $key => $value) { $score = $callback($value, $key); if (!is_numeric($score)) { continue; } $numeric = self::numericValue($score); if ($numeric === null) { continue; } if (!$found || ($pickMax ? ($numeric > $bestScore) : ($numeric < $bestScore))) { $best = $value; $bestScore = $numeric; $found = true; } } return $found ? $best : null; } /** * @param array $array */ private static function selectNumeric(array $array, bool $pickMax): float|int|null { $selected = null; foreach ($array as $value) { $numeric = self::numericValue($value); if ($numeric === null) { continue; } if ($selected === null || ($pickMax ? ($numeric > $selected) : ($numeric < $selected))) { $selected = $numeric; } } return $selected; } }