集合
介绍
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]