totalCount = $totalCount ?? count($entities); } /** * @inheritDoc */ #[\ReturnTypeWillChange] public function offsetSet($key, $value): void { if (is_null($key)) { $this->totalCount++; } parent::offsetSet($key, $value); } /** * @inheritDoc */ #[\ReturnTypeWillChange] public function offsetUnset($key): void { if ($this->offsetExists($key)) { $this->totalCount--; } parent::offsetUnset($key); } /** * Getter for total count * * @return int Total count */ public function getTotalCount(): int { return $this->totalCount; } /** * Return the values from a single field in the collection * * @param string $column * @param int|null $index_key * @return array * @see array_column() */ public function column(string $column, $index_key = null): array { return array_column($this->getArrayCopy(true), $column, $index_key); } /** * Apply a callback function on all elements in the collection and returns a new collection with the updated elements * * @param callable $callback * @return BaseCollection * @see array_map() */ public function map(callable $callback): BaseCollection { return new static(array_map($callback, $this->getArrayCopy()), $this->getTotalCount()); } /** * Filters the collection based on a callback that returns a boolean whether the current item should be kept. * * @param callable|null $callback * @param int $flag * @return BaseCollection * @see array_filter() */ public function filter(callable $callback = null, int $flag = 0): BaseCollection { return new static(array_filter($this->getArrayCopy(), $callback, $flag)); } /** * Reverse the orders of the elements in the collection * * @return $this */ public function reverse(): BaseCollection { return new static(array_reverse($this->getArrayCopy()), $this->getTotalCount()); } /** * Split the collection in smaller collections no bigger than the provided length * * @param int $length * @return static[] */ public function chunk(int $length): array { if ($length < 1) { throw new \RangeException('BaseCollection->chunk(): Size parameter expected to be greater than 0'); } return array_map(function ($array) { return new static($array); }, array_chunk($this->getArrayCopy(), $length)); } /** * @inheritDoc * * includes recursion for entity::toArray() function * @see BaseEntity::toArray() */ public function getArrayCopy(bool $recursive = false): array { if (!$recursive) { return parent::getArrayCopy(); } return array_map(function ($item) { return is_object($item) ? $item->toArray() : $item; }, parent::getArrayCopy()); } }