什么是集合
Illuminate\Support\Collection 类是操作数组数据的流式封装。
不必逐个调用 PHP 数组函数,你可以通过方法链直观地对数据进行加工。
集合是不可变的。每个方法都不会修改原集合,而是返回新的集合实例。你可以在保留原数据的同时安全操作。
创建集合
collect() 辅助函数
最常用的方式。传入数组生成集合:
Collection::make()
等同于 collect()。若你偏好门面风格,可以用它。
Collection::fromJson()
从 JSON 字符串创建集合,便于处理外部 API 响应。
常用方法
map — 转换每个元素
对每个元素执行处理,返回转换后的新集合。
filter / reject — 按条件过滤
filter() 保留满足条件的元素,reject() 排除满足条件的元素。
first / last — 获取单个元素
返回满足条件的第一个或最后一个元素。
pluck — 抽取指定键的值
从嵌套数组或模型中抽出特定字段。
groupBy — 按键分组
sortBy / sortByDesc — 排序
each — 对每个元素执行处理
用于有副作用的操作(日志、发邮件等)。不会改变集合本身。
flatMap — 映射后再拍平一层
将每个元素映射为数组,并将整体拍平为一维。
reduce — 聚合
把整个集合归约为单一值。
reduceInto — 聚合到对象
与 reduce 类似,但回调不需要返回值。适合直接修改已有对象。
&)。
chunk — 分块
将大集合按指定大小切分。适合分批处理或分页展示。
chunkBy — 按相邻的值分组切分
chunkBy 会将指定键或回调返回值相同的「相邻」元素归为一组,切分成多个小集合。例如,可以将拥有相同父级的相邻商品分为一组。
groupBy 不同,即使值相同,只要元素不相邻就会被分到不同的块中。
方法链
集合的价值体现在方法链上。可以将多个操作串联,实现复杂的数据变换。与 Eloquent 联动
Eloquent 查询结果始终以Illuminate\Database\Eloquent\Collection 实例返回。
它继承自基础 Collection,上述方法都可以使用。
Eloquent 集合特有方法
Eloquent\Collection 提供额外方法:
Lazy Collections
普通集合会把全部数据加载到内存。LazyCollection 借助 PHP Generator 逐条处理,适合数万条以上的大数据集,可节省内存。
创建 LazyCollection
大数据批处理
cursor() 逐条从数据库取回,处理大量记录时可大幅节省内存。但数据库连接会持续到处理完成。用 take 与 skip 分页
小结
常用方法汇总
常用方法汇总
集合 vs 数组函数
集合 vs 数组函数
集合在可读性上远胜数组函数。
普通集合 vs LazyCollection
普通集合 vs LazyCollection
- 普通集合:几百到几千条数据,直观简洁。
- LazyCollection:数万条以上大数据,节省内存。搭配
cursor()效果最佳。 - Eloquent 的
get()返回普通集合,cursor()返回 LazyCollection。