跳转到主要内容

什么是集合

Illuminate\Support\Collection 类是操作数组数据的流式封装。 不必逐个调用 PHP 数组函数,你可以通过方法链直观地对数据进行加工。
集合是不可变的。每个方法都不会修改原集合,而是返回新的集合实例。你可以在保留原数据的同时安全操作。

创建集合

collect() 辅助函数

最常用的方式。传入数组生成集合:

Collection::make()

等同于 collect()。若你偏好门面风格,可以用它。

Collection::fromJson()

从 JSON 字符串创建集合,便于处理外部 API 响应。

常用方法

map — 转换每个元素

对每个元素执行处理,返回转换后的新集合。

filter / reject — 按条件过滤

filter() 保留满足条件的元素,reject() 排除满足条件的元素。
filter() 之后索引会出现空洞。调用 values() 可以重新编号从 0 开始。

first / last — 获取单个元素

返回满足条件的第一个或最后一个元素。

pluck — 抽取指定键的值

从嵌套数组或模型中抽出特定字段。

groupBy — 按键分组

sortBy / sortByDesc — 排序

each — 对每个元素执行处理

用于有副作用的操作(日志、发邮件等)。不会改变集合本身。

flatMap — 映射后再拍平一层

将每个元素映射为数组,并将整体拍平为一维。

reduce — 聚合

把整个集合归约为单一值。
单纯求和可用 sum()$orders->sum(fn ($o) => $o['price'] * $o['quantity'])

reduceInto — 聚合到对象

reduce 类似,但回调不需要返回值。适合直接修改已有对象。
reduce 通过回调返回值作为下一次 $carry,适合聚合基本类型。reduceInto 则一直修改传入的对象,写法更简洁。
若目标是标量或数组,可在回调中使用引用(&)。

chunk — 分块

将大集合按指定大小切分。适合分批处理或分页展示。

方法链

集合的价值体现在方法链上。可以将多个操作串联,实现复杂的数据变换。

与 Eloquent 联动

Eloquent 查询结果始终以 Illuminate\Database\Eloquent\Collection 实例返回。 它继承自基础 Collection,上述方法都可以使用。
能通过数据库完成的过滤和排序,请使用查询构建器(whereorderBy 等),而不是先转为集合再操作。将全部数据加载到内存后再过滤会浪费资源。

Eloquent 集合特有方法

Eloquent\Collection 提供额外方法:

Lazy Collections

普通集合会把全部数据加载到内存。LazyCollection 借助 PHP Generator 逐条处理,适合数万条以上的大数据集,可节省内存。

创建 LazyCollection

大数据批处理

cursor() 逐条从数据库取回,处理大量记录时可大幅节省内存。但数据库连接会持续到处理完成。

takeskip 分页

小结

集合在可读性上远胜数组函数。
  • 普通集合:几百到几千条数据,直观简洁。
  • LazyCollection:数万条以上大数据,节省内存。搭配 cursor() 效果最佳。
  • Eloquent 的 get() 返回普通集合,cursor() 返回 LazyCollection。
最后修改于 2026年7月18日