array);
}
/**
* Return the size of the array.
* Alias of `count`
*
* @return int
*/
public function size(): int {
return $this->count();
}
/**
* @psalm-suppress UnsafeInstantiation
*
* @return $this
*/
public function __clone() {
return new static($this->array);
}
/**
* Checks whether the given element is in this array
*
* @param mixed $element
*
* @return bool
*/
public function contains(mixed $element): bool {
return in_array($element, $this->array, true);
}
/**
* Checks whether this array is empty
*
* @return bool
*/
public function isEmpty(): bool {
return count($this->array) === 0;
}
/**
* Searches the array with a given callback and returns the first element if found.
*
* The callback function takes one or two parameters:
*
* function ($element [, $query]) {}
*
* The callback must return a boolean
* When it's passed, $query must be the first argument:
*
* - find($query, callback)
* - find(callback)
*
* @param array $arguments
*
* @return mixed the found element or null if it hasn't been found
*
* @psalm-suppress MixedAssignment
* @psalm-suppress MixedFunctionCall
*/
public function find(mixed ...$arguments): mixed {
foreach ($this->array as $element) {
$return = count($arguments) === 1 ? $arguments[0]($element) : $arguments[1]($element, $arguments[0]);
if ($return) {
return $element;
}
}
return null;
}
/**
* Searches the array with a given callback and returns the last element if found.
*
* The callback function takes one or two parameters:
*
* function ($element [, $query]) {}
*
* The callback must return a boolean
* When it's passed, $query must be the first argument:
*
* - find($query, callback)
* - find(callback)
*
* @param array $arguments
*
* @return mixed the found element or null if it hasn't been found
*
* @psalm-suppress MixedAssignment
* @psalm-suppress MixedFunctionCall
*/
public function findLast(mixed ...$arguments): mixed {
$reverse = array_reverse($this->array, true);
foreach ($reverse as $element) {
$return = count($arguments) === 1 ? $arguments[0]($element) : $arguments[1]($element, $arguments[0]);
if ($return) {
return $element;
}
}
return null;
}
/**
* Searches the array with a given callback and returns all matching elements.
*
* The callback function takes one or two parameters:
*
* function ($element [, $query]) {}
*
* The callback must return a boolean
* When it's passed, $query must be the first argument:
*
* - find($query, callback)
* - find(callback)
*
* @param mixed ...$arguments
*
* @return static an ArrayObject or a collection of found elements
*
* @psalm-suppress UnsafeInstantiation
* @psalm-suppress MixedAssignment
* @psalm-suppress MixedFunctionCall
*/
public function findAll(mixed ...$arguments): static {
$array = [];
foreach ($this->array as $k => $element) {
$return = count($arguments) === 1 ? $arguments[0]($element) : $arguments[1]($element, $arguments[0]);
if ($return) {
$array[$k] = $element;
}
}
return new static($array);
}
/**
* Searches the array for query using the callback function on each element
*
* The callback function takes one or two parameters:
*
* function ($element [, $query]) {}
*
* The callback must return a boolean
* When it's passed, $query must be the first argument:
*
* - search($query, callback)
* - search(callback)
*
* @param mixed ...$arguments
*
* @return bool
* @psalm-suppress MixedFunctionCall
* @psalm-suppress MixedAssignment
*/
public function search(mixed ...$arguments): bool {
foreach ($this->array as $element) {
$return = count($arguments) === 1 ? $arguments[0]($element) : $arguments[1]($element, $arguments[0]);
if ($return) {
return true;
}
}
return false;
}
/**
* Returns the php array type
*
* @return array
*/
public function toArray(): array {
return $this->array;
}
/**
* Sorts the array
*
* @param Comparator|callable|null $cmp
*
* @return $this
*/
public function sort(Comparator|callable $cmp = null): self {
$this->doSort($this->array, 'usort', 'sort', $cmp);
return $this;
}
/**
* Internal sort function
*
* @param array $array the array on which is operated on
* @param callable $usort the sort function for user passed $cmd
* @param callable $sort the default sort function
* @param Comparator|callable|null $cmp the compare function
*/
protected function doSort(array & $array, callable $usort, callable $sort, Comparator|callable $cmp = null): void {
if (is_callable($cmp)) {
$usort($array, $cmp);
} elseif ($cmp instanceof Comparator) {
$usort(
$array,
function (mixed $a, mixed $b) use ($cmp): int {
return $cmp->compare($a, $b);
}
);
} else {
$sort($array);
}
}
/**
* Tests whether all elements in the array pass the test implemented by the provided function.
*
* Returns true
for an empty array.
*
* @param callable(mixed, mixed): scalar $callback
*
* @return bool
*/
public function every(callable $callback): bool {
return $this->count() === count(array_filter($this->array, $callback));
}
/**
* Tests whether at least one element in the array passes the test implemented by the provided function.
*
* Returns false
for an empty array.
*
* @param callable(mixed, mixed): scalar $callback
*
* @return bool
*/
public function some(callable $callback): bool {
return count(array_filter($this->array, $callback)) > 0;
}
/**
* Filters elements using a callback function
*
* @param callable(mixed, mixed): scalar $callback the filter function
*
* @return static
* @psalm-suppress UnsafeInstantiation
*/
public function filter(callable $callback): self {
return new static(array_filter($this->array, $callback));
}
/**
* Applies the callback to the elements
*
* @param callable $callback the applied callback function
*
* @return static
* @psalm-suppress UnsafeInstantiation
*/
public function map(callable $callback): self {
return new static(array_map($callback, $this->array));
}
}