X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FBaseCollection.php;h=977292e5159a24eafb851bd610dd913bdd81d766;hb=ddd2c72be8e7245389f97d74dd847f5a20410936;hp=8bad3b8d28abf5863474bb9086446ac3cc43711d;hpb=592762be27c98bf6b626ea4a5f69971789149e80;p=friendica.git diff --git a/src/BaseCollection.php b/src/BaseCollection.php index 8bad3b8d28..977292e515 100644 --- a/src/BaseCollection.php +++ b/src/BaseCollection.php @@ -1,14 +1,32 @@ . + * + */ namespace Friendica; /** - * The Collection classes inheriting from this abstract class are meant to represent a list of database record. - * The associated model class has to be provided in the child classes. + * The Collection classes inheriting from this class are meant to represent a list of structured objects of a single type. * * Collections can be used with foreach(), accessed like an array and counted. */ -abstract class BaseCollection extends \ArrayIterator +class BaseCollection extends \ArrayIterator { /** * This property is used with paginated results to hold the total number of items satisfying the paginated request. @@ -17,22 +35,132 @@ abstract class BaseCollection extends \ArrayIterator protected $totalCount = 0; /** - * @param BaseModel[] $models - * @param int|null $totalCount + * @param BaseEntity[] $entities + * @param int|null $totalCount + */ + public function __construct(array $entities = [], int $totalCount = null) + { + parent::__construct($entities); + + $this->totalCount = $totalCount ?? count($entities); + } + + /** + * @inheritDoc */ - public function __construct(array $models = [], int $totalCount = null) + #[\ReturnTypeWillChange] + public function offsetSet($key, $value): void { - parent::__construct($models); + if (is_null($key)) { + $this->totalCount++; + } - $this->models = $models; - $this->totalCount = $totalCount ?? count($models); + parent::offsetSet($key, $value); } /** - * @return int + * @inheritDoc */ - public function getTotalCount() + #[\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()); + } }