* @throws \LengthException */ Collection::macro('transpose', function () : Collection { $values = $this->values(); $expectedLength = count($this->first()); $diffLength = count(array_intersect_key(...$values)); if ($expectedLength !== $diffLength) { throw new \LengthException("Element's length must be equal."); } $items = array_map(function (...$items) { return new static($items); }, ...$values); return new static($items); }); } if (!Collection::hasMacro('partition')) { /* * Output a collection with two elements. Items in the first element did pass * the given $callback, items in the second element did not. * * @param callable $callback * * @return \Illuminate\Support\Collection */ Collection::macro('partition', function (callable $callback) : Collection { $partitions = [new static(), new static()]; foreach ($this->items as $item) { $partitions[!(int) $callback($item)][] = $item; } return new static($partitions); });
}); } if (!Collection::hasMacro('toEloquent')) { /** * Get a Database Eloquent collection instance from this collection. * Filters out any items that are not Models. * * @return \Illuminate\Database\Eloquent\Collection */ Collection::macro('toEloquent', function () { return EloquentCollection::make($this->filter(function ($item) { return $item instanceof Model; })->all()); }); } if (!Collection::hasMacro('transpose')) { /** * Transpose a collection. Rows become columns, columns become rows. * E.g. becomes * [1,2] [1,3] * [3,4] [2,4] * * @return \Illuminate\Support\Collection */ Collection::macro('transpose', function () { $type = get_class($this); return $type::make(array_map(function (...$items) { return $items; }, ...$this->values())); }); }