集合
介绍
Illuminate\Support\Collection 类为处理数据数组提供了一个流畅、方便的包装器。 例如,查看以下代码。 我们将使用 collect 助手从数组中创建一个新的集合实例,对每个元素运行 strtoupper 函数,然后删除所有空元素:
$collection = collect(['taylor', 'abigail', null])->map(function (string $name) {
return strtoupper($name);
})->reject(function (string $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 (string $value) {
return Str::upper($value);
});
});
$collection = collect(['first', 'second']);
$upper = $collection->toUpper();
// ['FIRST', 'SECOND']
通常,你应该在服务提供者的 boot 方法中声明集合宏。
宏参数
如有必要,可以定义接受其他参数的宏:
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Lang;
Collection::macro('toLocale', function (string $locale) {
return $this->map(function (string $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 containsOneItem containsStrict count countBy crossJoin dd diff diffAssoc diffKeys doesntContain dump duplicates duplicatesStrict each eachSpread every except filter first firstOrFail firstWhere flatMap flatten flip forget forPage get groupBy has hasAny implode intersect intersectAssoc intersectByKeys isEmpty isNotEmpty join keyBy keys last lazy 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 reduceSpread reject replace replaceRecursive reverse search shift shuffle skip skipUntil skipWhile slice sliding 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 value 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]]