Skip to content

Laravel 必知必会的 Collection

「这是我参与2022首次更文挑战的第1天,活动详情查看:2022首次更文挑战」。

46d4365fe310338849eb87a04d4f828b.jpeg

开工啦!好久没有更文章了,真的手生了,我删了写,写了删。

纠结了好久,还是写Laravel的Collection吧。

因为我之前的习惯一直是通过DB查询到数据之后toArray()转成数组进行处理

这段时间读了laravel的文档,温故知新,collection值得拥有,我要拥抱collection了。

集合collection和数组array的区别

查看源码

Laravel中的数组,源代码位置Illuminate\Support\Arr.php;

Laravel中的集合,源代码位置Illuminate\Support\Collection.php;

集合和数组的联系

  1. 集合是对数组的再次封装,以对象的形式呈现;
  2. 提供了很多方法功能(这些方法内部大多采用了回调函数),比数组形式的操作要灵活很多;
  3. 我理解集合就是用面向对象的形式操作元素和以数组形式操作元素的区别:如果以对象操作,是可以链式操作的;如果按照数组操作,则会产生很多中间临时变量或者语句,代码冗长,不好理解,随着时间的推移难以维护;

常用命令

创建集合

ini
collect([1, 2, 3]);

返回该集合所代表的底层数组:

scss
$collection->all();

返回集合中所有项目的平均值:

scss
collect([1, 1, 2, 4])->avg() $collection->average();

将集合拆成多个给定大小的较小集合:

看到这里有写go语言的感觉了

scss
collect([1, 2, 3, 4, 5])->chunk(2); 结果是:[[1,2], [3,4], [5]]

将多个数组组成的集合折成单一数组集合:

lua
collect([[1],  [4,  5]])->collapse(); // [1, 4, 5]

将一个集合的值作为键,再将另一个集合作为值合并成一个集合

ini
collect(['name', 'age'])->combine(['George', 29]); 结果: Illuminate\Support\Collection^ {#32   #items: array:2 [     "name" => "George"     "age" => 29   ] }

将给定的 数组 或集合值追加到集合的末尾

css
collect(['PHP'])->concat(['Laravel']); // ['PHP', 'Laravel']

用来判断该集合是否含有指定的项目:

sql
collect(['name' => 'Desk'])->contains('Desk'); // true collect(['name' => 'Desk'])->contains('name',  'Desk'); // true

返回该集合内的项目总数:

这个和数组一样

scss
$collection->count();

交叉连接指定数组或集合的值,返回所有可能排列的笛卡尔积

在collection集合中的使用如下:

css
collect([1, 2])->crossJoin(['a', 'b']); 结果:[[1, 'a'],[1, 'b'],[2, 'a'],[2, 'b']]

延伸一下:笛卡尔积是什么?

笛卡尔乘积是指在数学中,两个[集合]X_和_Y_的笛卡尔积(Cartesian product),又称[直积],表示为_X × Y,第一个对象是_X_的成员而第二个对象是_Y_的所有可能[有序对]的其中一个成员。

假设集合A={a, b},集合B={0, 1, 2},则两个集合的笛卡尔积为{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}。

dd($collection) 的另一个写法

css
collect(['John Doe', 'Jane Doe'])->dd();

延伸一下:dd()函数的使用

这里重点提一下,我非常喜欢使用dd()打印结果,dd函数的源码如下

php
if (!function_exists('dd')) {     function dd(...$vars)     {         foreach ($vars as $v) {             VarDumper::dump($v);         }         exit(1);     } }

如果我们想打印结果且中断程序执行,dd()函数是一个非常好的选择。

如果我们想打印结果但是不想中断程序执行可以用 dump():

scss
collect(['John Doe', 'Jane Doe'])->dump();

返回原集合中存在而指定集合中不存在的值

scss
collect([1,  2,  3])->diff([2, 4]);  结果:[1, 3]

返回集合中 与指定集合键值对 不一致的数据

这个就非常好用了

dart
collect(['color' => 'orange', 'remain' =>  6])->diffAssoc(['color' => 'yellow', 'remain' => 6, 'used' => 6]);   结果是:['color' => 'orange']

返回原集合中存在,而指定集合中不存在键,所对应的键 / 值对

dart
collect(['one' => 10, 'two' => 20])->diffKeys(['two' => 2, 'four' => 4]);  结果: ['one' => 10]

遍历集合中的项目,并将之传入给定的回调函数:

ini
$collection = $collection->each(function ($item, $key) {});

验证集合中的每一个元素是否通过指定的条件测试

bash
collect([1,  2])->every(function  ($value,  $key)  { return $value > 1; });  结果:false

返回集合中排除指定键的所有项目:

bash
$collection->except(['xxx', 'yyy']);

欢迎互动

大家有什么好用的命令欢迎在评论区讨论

硬核文章推荐

性能优化反思:减少DB查询,合理使用成员变量。

PHP转Go 2021年年中总结

如何第一时间收到接口报错?不用测试妹子再质疑你是不是接口挂了。

Git使用实战:多人协同开发,紧急修复线上bug的Git操作指南。

性能优化反思:不要在for循环中操作DB

性能优化反思:不要在for循环中操作DB 进阶版

最后

👍🏻:觉得有收获请点个赞鼓励一下!

🌟:收藏文章,方便回看哦!

💬:评论交流,互相进步!

🚀 学习遇到瓶颈?想进大厂?

看完这篇技术文章,如果还是觉得不够系统,或者想在实战中快速提升?
王中阳的就业陪跑训练营,提供定制化学习路线 + 企业级实战项目 + 简历优化 + 模拟面试。

了解训练营详情