Illuminate\Support\Collection 类
1.提供了一个更具可读性和更便于处理数组数据的封装。
创建集合
如上所述, collect
辅助函数会为指定的数组返回一个新的 Illuminate\Support\Collection
实例。因此,我们可以这样轻松的创建一个集合:
$collection = collect([1, 2, 3]);
Tip:通常,Eloquent 查询的结果返回的内容都是
Collection
实例。
扩展集合
集合都是「可宏扩展」(macroable) 的,它允许你在执行时将其它方法添加到 Collection
类。例如,通过下面的代码在 Collection
类中添加一个 toUpper
方法:
use Illuminate\Support\Str;
Collection::macro('toUpper', function () {
return $this->map(function ($value) {
return Str::upper($value);
});
});
$collection = collect(['first', 'second']);
$upper = $collection->toUpper();
方法列表
- 集合或惰性集合的方法几乎通用
all() 展示底层数组
countBy() 方法计算集合中每个值的出现次数。默认情况下,该方法计算每个元素的出现次数:
$collection = collect([1, 2, 2, 2, 3]);
$counted = $collection->countBy();
$counted->all();
// [1 => 1, 2 => 3, 3 => 1]
//但是,你也可以传递一个回调函数给 countBy 来计算自定义的值出现的次数:
$collection = collect(['alice@gmail.com', 'bob@yahoo.com', 'carlos@gmail.com']);
$counted = $collection->countBy(function ($email) {
return substr(strrchr($email, "@"), 1);
});
$counted->all();
// ['gmail.com' => 2, 'yahoo.com' => 1]
懒集合
注意:在进一步学习 Laravel 的懒集合之前,我们先花点时间熟悉一下 PHP generators。
为了补充已经很强大的 Collection
类, LazyCollection
类利用了 PHP 的 generators 来允许你在保持低内存使用率的同时使用非常大的数据集。
例如,假设你的应用需要处理一个千兆字节的日志文件,同时利用 Laravel 的集合方法来解析这个日志文件。与其一次将整个文件读入内存,不如使用懒集合在给定时间仅将文件的一小部分保留在内存中:
- 创建懒集合
要创建懒集合,应将 PHP 生成器函数传递给集合的 make 方法:
use Illuminate\Support\LazyCollection;
LazyCollection::make(function () {
$handle = fopen('log.txt', 'r');
while (($line = fgets($handle)) !== false) {
yield $line;
}
});
网友评论