Collection 集合
Illuminate\Support\Collection
类提供了一个更具可读性的、更便于处理数组数据的封装,具体例子看下面的代码。
我们使用了 collect
函数从数组中创建新的集合实例,对其中的每个元素运行 strtoupper
函数之后再移除所有的空元素:
php
collect(['taylor', 'abigail', null])
->map(fn ($name) => strtoupper($name))
->reject(fn ($name) => empty($name));
正如你看到的,Collection
类允许你链式调用其方法,以达到在底层数组上优雅地执行 map
和 reject
操作。一般来说,集合是不可改变的,这意味着每个 Collection
方法都会返回一个全新的 Collection
实例。
创建集合
如上所述,辅助函数 collect
会为给定的数组返回一个新的 Illuminate\Support\Collection
实例。也就是说,创建一个集合就这么简单:
php
collect([1, 2, 3]);
默认情况下, Eloquent 查询的结果返回的内容都是
Collection
实例。
可用的方法
接下来的内容,我们会探讨 Collection
类每个可用的方法。**记住,所有方法都可以以方法链的形式优雅地操纵数组。**而且,几乎所有的方法都会返回新的 Collection
实例,允许在必要时保存集合的原始副本。
方法名 | 简单说明 |
---|---|
after | 获取给定项目之后的项目 |
all | 返回该集合表示的底层数组 |
average | 方法avg() 的别名 |
avg | 返回给定键的平均值 |
before | 获取给定项目之前的项目 |
chunk | 将集合拆分为多个指定大小的集合组 |
chunkWhile | 根据给定的回调将集合分成多个较小的集合 |
collapse | 将数组集合折叠成单个集合 |
collect | collect 方法返回一个包含当前集合中的项目的新的 Collection 实例 |
combine | 将一个集合的值作为键,再将另一个数组或者集合的值作为值合并成一个集合 |
concat | 将给定数组或集合的值附加到另一个集合的末尾 |
contains | 判断集合是否包含给定的项目 |
containsOneItem | 判断集合是否包含单个项目 |
containsStrict | 使用「严格模式」来判断集合中是否包含给定的项目 |
count | 返回该集合内的项目总数 |
countBy | 计算集合中值的出现次数 |
crossJoin | 返回集合中所有可能排列的笛卡尔积 |
dd | 打印集合的元素并终止脚本的执行 |
diff | 基于值求差集 |
diffAssoc | 基于键值对求差集 |
diffAssocUsing | 使用回调获取集合中键和值不存在的项目 |
diffKeys | 基于键求差集 |
diffKeysUsing | 使用回调获取集合中键不存在于给定项中的项 |
diffUsing | 获取集合中不存在给定项目的项目 |
doesntContain | 判断集合是否不包含给定的项目 |
dump | 打印集合的元素 |
duplicates | 从集合中检索并返回重复值 |
duplicatesStrict | 使用严格模式从集合中检索并返回重复值 |
each | 迭代集合中的内容,同时将其传递到回调函数中 |
eachSpread | 迭代集合中的内容,同时将其传递到回调函数中 |
ensure | 确保集合中的项目属于特定数据类型 |
every | 可用于验证集合中每一个元素都通过回调测试 |
except | 返回集合中除了指定键以外的所有项目 |
filter | 使用给定的回调函数过滤集合的内容,只留下那些通过给定值为真的集合项 |
first | 返回集合中第一个元素 |
firstOrFail | 返回集合中第一个元素,如果没有匹配到则回抛出 ItemNotFoundException 错误 |
firstWhere | 返回给定键值对的第一个元素 |
flatMap | 遍历集合并将其中的每个值传递到给定的回调 |
flatten | 将多维集合转为一维 |
flip | 将集合中的键和对应的数值进行互换 |
forget | 改变原集合,通过给定的键来移除掉集合中对应的项 |
forPage | 返回给定页码上显示的项目的新集合 |
get | 获取一维数组给定键的集合项 |
groupBy | 根据给定的键对集合内的项目进行分组 |
has | 判断集合中是否存在给定的键 |
hasAny | 确定集合中是否存在任何指定的键 |
implode | 合并集合中的项目 |
intersect | 两个集合的交集 |
intersectByKeys | 删除原集合中不存在于给定数组或集合中的任何键 |
isEmpty | 判断集合是否为空 |
isNotEmpty | 判断集合是否不为空 |
join | 将集合的值与字符串连接起来 |
keyBy | 以给定的键作为集合的键 |
keys | 返回集合的所有键 |
last | 返回集合中通过给定真实测试的最后一个元素 |
lazy | 返回一个新的 LazyCollection 实例 |
macro | 在运行时向 Collection 类添加自定义方法 |
make | 创建一个新的集合实例 |
map | 遍历集合并将每一个值传入给定的回调 |
mapInto | 遍历集合,通过将值传递给构造函数来创建给定类的新实例 |
mapSpread | 改变原集合,迭代集合的项目,将每个嵌套的项目值传递到给定的闭包中。 闭包可以自由修改并返回它,从而形成一个新的修改后的集合。 |
mapToDirectory | 通过给定的闭包对集合的项目进行分组。该闭包应返回一个包含单个键/值对的关联数组,从而形成一个新的分组值数组 |
mapToGroups | 通过给定的闭包对集合的项目进行分组。 该闭包应返回一个包含单个键/值对的关联数组,从而形成一个新的分组值集合 |
mapWithKeys | 遍历集合并将每个值传入给定的回调 |
max | 返回给定键的最大值 |
median | 方法返回给定键的中间值 |
merge | 将给定数组或集合合并到原集合 |
mergeRecursive | 将给定的数组或集合与原始集合递归合并 |
min | 返回给定键的最小值 |
mode | 返回给定键的众数值 |
nth | 创建由每隔n 个元素组成一个新集合 |
only | 返回集合中给定键的所有项目 |
pad | 将用给定的值填充数组,直到数组达到指定的大小 |
partition | 配合list() 方法区分回调函数满足和不满足的数据 |
pipe | 将集合传给给定的回调并返回结果 |
pipeInto | 创建给定类的新实例,并将集合传递给构造函数 |
pipeThrough | 将集合传递给给定的闭包数组并返回执行闭包的结果 |
pluck | 获取集合中给定键对应的所有值 |
pop | 改变原集合,移除并返回集合中的最后一个项目 |
prepend | 改变原集合,将给定的值添加到集合的开头 |
pull | 改变原集合,把给定键对应的值从集合中移除并返回 |
push | 改变原集合,把给定值添加到集合的末尾 |
put | 改变原集合,在集合内设置给定的键值对 |
random | 从集合中返回一个随机项 |
reduce | 将每次迭代的结果传递给下一次迭代直到集合减少为单个值 |
reduceSpread | 将集合缩减为值数组,将每次迭代的结果传递到后续迭代中 |
reject | 使用指定的回调过滤集合 |
replace | 通过指定格式替换集合元素 |
replaceRecursive | 将集合递归到数组中并且对内部的值应用相同的替换 |
reverse | 倒转集合中项目的顺序 |
search | 搜索给定的值并返回它的键 |
select | 从多维数组中选择一定数量的键 |
shift | 改变原集合,移除并返回集合的第一个项目 |
shuffle | 随机排序集合中的项目 |
skip | 返回一个新的集合,其中给定数量的元素从集合的开头删除 |
skipUntil | 跳过集合中的项目,直到给定的回调返回 true ,然后将集合中的其余项目作为新集合实例返回 |
skipWhile | 跳过集合中的项目,同时给定的回调返回 true ,然后将集合中的其余项目作为新集合返回 |
slice | 返回集合中给定值后面的部分 |
sliding | sliding 方法返回一个新分组的块集合 |
sole | 返回集合中通过给定真值测试的第一个元素 |
some | contains 方法的别名 |
sort | 保留原数组的键,对集合进行排序 |
sortBy | 以给定的键对集合进行正序排序 |
sortByDesc | 与 sortBy 一样,以相反的顺序来对集合进行排序 |
sortDesc | 对集合进行倒序排序 |
sortKeys | 按底层关联数组的键对集合进行排序 |
sortKeysDesc | 按底层关联数组的键对集合进行倒序排序 |
sortKeysUsing | 使用回调按底层关联数组的键对集合进行排序 |
splice | 删除并返回从给定值后的内容,原集合也会受到影响 |
split | 将集合按给定的值拆分 |
splitIn | 将集合分为给定数量的组 |
sum | 返回集合内所有项目的总和 |
take | 返回给定数量项目的新集合 |
takeUntil | 将返回集合中的项目,直到给定的回调返回 true |
takeWhile | 返回集合中的项目,直到给定的回调返回 false |
tap | 将集合传递给回调,在特定点「tap」集合 |
times | 通过回调在给定次数内创建一个新的集合 |
toArray | 将集合转换成 PHP 数组 |
toJson | 将集合转换成 JSON 字符串 |
transform | 改变原集合,迭代集合并对集合内的每个项目调用给定的回调 |
undot | 使用"点"表示法的单维集合扩展为多维集合 |
union | 将给定的数组添加到集合中,求并集 |
unique | 返回集合中所有唯一的项目 |
uniqueStrict | 使用严格模式返回集合中所有唯一的项目 |
unless | 除非方法的第一个参数的计算结果为true,否则该方法将执行给定的回调 |
unlessEmpty | whenNotEmpty 方法的别名 |
unlessNotEmpty | whenEmpty 方法别名 |
unwrap | 静态 unwrap 方法在适用时从给定值返回集合的基础项 |
value | 从集合的第一个元素中检索给定值 |
values | 返回键被重置为连续编号的新集合 |
when | 当传入的第一个参数为 true 的时,将执行给定的回调 |
whenEmpty | 当集合为空时,whenEmpty 方法将执行给定的回调 |
whenNotEmpty | 当集合不为空时,whenNotEmpty 方法将执行给定的回调 |
where | 通过给定的键值过滤集合 |
whereStrict | 使用严格模式通过给定的键值过滤集合 |
whereBetween | 通过确定指定的项目值是否在给定范围内来过滤集合 |
whereIn | 通过给定的键值数组来过滤集合 |
whereInStrict | 使用严格模式通过给定的键值数组来过滤集合 |
whereInstanceOf | 按给定的类类型过滤集合 |
whereNotBetween | 通过确定指定的项目值不存在给定范围内来过滤集合 |
whereNotIn | 集合中不包含的给定键值对进行匹配 |
whereNotInStrict | 使用严格模式通过集合中不包含的给定键值对进行匹配 |
whereNotNull | 返回集合中给定键不为 null 的项目 |
whereNull | 返回集合中给定键为 null 的项目 |
wrap | 静态 wrap 方法在适用时将给定值包装在集合中 |
zip | 将给定数组的值与相应索引处的原集合的值合并在一起 |
其它项目使用
安装
Laravel 中的 Collection 使用 Composer 管理,所以可以在项目中使用 composer 安装到非 Laravel 项目中,通过下面使用命令安装它。
bash
composer require illuminate/support
执行完上面的命令将得到所需要的拓展包。
使用
php
<?php
// 引入 package
require __DIR__ . '/vendor/autoload.php';
// 简单使用
collect([1, 2, 3]); // Illuminate\Support\Collection {#1070 all: [1, 2, 3]}
在JS中使用集合操作
如果在 JavaScript 中也需要使用类似的数组操作,具体可以可以参考 ecrmnn/collect.js。