+
+ /**
+ * 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());
+ }
+
+ /**
+ * @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());
+ }