集合
介绍
Illuminate\Support\Collection 类为处理数据数组提供了一个流畅、方便的包装器。例如,查看以下代码。我们将使用 collect 助手从数组中创建一个新的集合实例,对每个元素运行 strtoupper 函数,然后删除所有空元素:
$collection = collect(['taylor', 'abigail', null])->map(function ($name) {
    return strtoupper($name);
})->reject(function ($name) {
    return empty($name);
});
如你所见,Collection 类允许你链接其方法以执行流畅的映射和减少底层数组。一般来说,集合是不可变的,这意味着每个 Collection 方法都会返回一个全新的 Collection 实例。
创建集合
如上所述,collect 帮助器为给定数组返回一个新的 Illuminate\Support\Collection 实例。因此,创建一个集合非常简单:
$collection = collect([1, 2, 3]);
技巧:Eloquent 查询的结果总是作为 Collection 实例返回。
扩展集合
集合是「可宏化的」,它允许你在运行时向 Collection 类添加其他方法。 Illuminate\Support\Collection 类的 macro 方法接受一个闭包,该闭包将在调用宏时执行。宏闭包可以通过 $this 访问集合的其他方法,就像它是集合类的真实方法一样。例如,以下代码在 Collection 类中添加了 toUpper 方法:
use Illuminate\Support\Collection;
use Illuminate\Support\Str;
Collection::macro('toUpper', function () {
    return $this->map(function ($value) {
        return Str::upper($value);
    });
});
$collection = collect(['first', 'second']);
$upper = $collection->toUpper();
// ['FIRST', 'SECOND']
通常,你应该在service provider的 boot 方法中声明集合宏。
宏参数
如有必要,可以定义接受其他参数的宏:
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Lang;
Collection::macro('toLocale', function ($locale) {
    return $this->map(function ($value) use ($locale) {
        return Lang::get($value, [], $locale);
    });
});
$collection = collect(['first', 'second']);
$translated = $collection->toLocale('es');
可用的方法
对于剩余的大部分集合文档,我们将讨论 Collection 类中可用的每 个方法。请记住,所有这些方法都可以链式调用,以便流畅地操作底层数组。此外,几乎每个方法都会返回一个新的 Collection 实例,允许你在必要时保留集合的原始副本:
all average avg chunk chunkWhile collapse collect combine concat contains containsStrict count countBy crossJoin dd diff diffAssoc diffKeys doesntContain dump duplicates duplicatesStrict each eachSpread every except filter first firstWhere flatMap flatten flip forget forPage get groupBy has implode intersect intersectByKeys isEmpty isNotEmpty join keyBy keys last macro make map mapInto mapSpread mapToGroups mapWithKeys max median merge mergeRecursive min mode nth only pad partition pipe pipeInto pipeThrough pluck pop prepend pull push put random range reduce reduceMany reduceSpread reject replace replaceRecursive reverse search shift shuffle sliding skip skipUntil skipWhile slice sole some sort sortBy sortByDesc sortDesc sortKeys sortKeysDesc sortKeysUsing splice split splitIn sum take takeUntil takeWhile tap times toArray toJson transform undot union unique uniqueStrict unless unlessEmpty unlessNotEmpty unwrap values when whenEmpty whenNotEmpty where whereStrict whereBetween whereIn whereInStrict whereInstanceOf whereNotBetween whereNotIn whereNotInStrict whereNotNull whereNull wrap zip
方法列表
all()
all 方法返回由集合表示的底层数组:
collect([1, 2, 3])->all();
// [1, 2, 3]
average()
avg 方法的别名。
avg()
avg 方法返回给定键的 平均值:
$average = collect([
    ['foo' => 10],
    ['foo' => 10],
    ['foo' => 20],
    ['foo' => 40]
])->avg('foo');
// 20
$average = collect([1, 1, 2, 4])->avg();
// 2
chunk()
chunk 方法将集合分成多个给定大小的较小集合:
$collection = collect([1, 2, 3, 4, 5, 6, 7]);
$chunks = $collection->chunk(4);
$chunks->all();
// [[1, 2, 3, 4], [5, 6, 7]]
当使用诸如 Bootstrap 之类的网格系统时,此方法在 views 中特别有用 . 例如,假设你有一组 Eloquent 模型要在网格中显示:
@foreach ($products->chunk(3) as $chunk)
    <div class="row">
        @foreach ($chunk as $product)
            <div class="col-xs-4">{{ $product->name }}</div>
        @endforeach
    </div>
@endforeach
chunkWhile()
chunkWhile 方法根据给定回调的评估将集合分成多个更小的集合。传递给闭包的 $chunk 变量可用于检查前一个元素:
$collection = collect(str_split('AABBCCCD'));
$chunks = $collection->chunkWhile(function ($value, $key, $chunk) {
    return $value === $chunk->last();
});
$chunks->all();
// [['A', 'A'], ['B', 'B'], ['C', 'C', 'C'], ['D']]
collapse()
collapse 方法将数组集合折叠成一个单一的平面集合:
$collection = collect([
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9],
]);
$collapsed = $collection->collapse();
$collapsed->all();
// [1, 2, 3, 4, 5, 6, 7, 8, 9]
collect()
collect 方法返回一个新的 Collection 实例,其中包含当前集合中  的项目:
$collectionA = collect([1, 2, 3]);
$collectionB = $collectionA->collect();
$collectionB->all();
// [1, 2, 3]
collect 方法主要用于将 惰性 集合 转换为标准的 Collection 实例:
$lazyCollection = LazyCollection::make(function () {
    yield 1;
    yield 2;
    yield 3;
});
$collection = $lazyCollection->collect();
get_class($collection);
// 'Illuminate\Support\Collection'
$collection->all();
// [1, 2, 3]
技巧:当你有一个 Enumerable 的实例并且需要一个非惰性集合实例时,collect 方法特别有用。由于 collect() 是 Enumerable 合约的一部分,你可以安全地使用它来获取 Collection 实例。
combine()
combine 方法将集合的值作为键与另一个数组或集合的值组合:
$collection = collect(['name', 'age']);
$combined = $collection->combine(['George', 29]);
$combined->all();
// ['name' => 'George', 'age' => 29]