集合collection和数组array的区别
查看源码
Laravel中的数组,源代码位置Illuminate\Support\Arr.php;
Laravel中的集合,源代码位置Illuminate\Support\Collection.php;
集合和数组的联系
- 集合是对数组的再次封装,以对象的形式呈现;
- 提供了很多方法功能(这些方法内部大多采用了回调函数),比数组形式的操作要灵活很多;
- 我理解集合就是用面向对象的形式操作元素和以数组形式操作元素的区别:如果以对象操作,是可以链式操作的;如果按照数组操作,则会产生很多中间临时变量或者语句,代码冗长,不好理解,随着时间的推移难以维护;
常用命令
创建集合
collect([1, 2, 3]);
返回该集合所代表的底层数组:
$collection->all();
返回集合中所有项目的平均值:
collect([1, 1, 2, 4])->avg() $collection->average();
将集合拆成多个给定大小的较小集合:
看到这里有写go语言的感觉了
collect([1, 2, 3, 4, 5])->chunk(2); 结果是:[[1,2], [3,4], [5]]
将多个数组组成的集合折成单一数组集合:
collect([[1], [4, 5]])->collapse(); // [1, 4, 5]
将一个集合的值作为键,再将另一个集合作为值合并成一个集合
collect(['name', 'age'])->combine(['George', 29]); 结果: Illuminate\Support\Collection^ {#32 #items: array:2 [ "name" => "George" "age" => 29 ] }
将给定的 数组 或集合值追加到集合的末尾
collect(['PHP'])->concat(['Laravel']); // ['PHP', 'Laravel']
用来判断该集合是否含有指定的项目:
collect(['name' => 'Desk'])->contains('Desk'); // true collect(['name' => 'Desk'])->contains('name', 'Desk'); // true
返回该集合内的项目总数:
这个和数组一样
$collection->count();
交叉连接指定数组或集合的值,返回所有可能排列的笛卡尔积
在collection集合中的使用如下:
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) 的另一个写法
collect(['John Doe', 'Jane Doe'])->dd();
延伸一下:dd()函数的使用
这里重点提一下,我非常喜欢使用dd()打印结果,dd函数的源码如下
if (!function_exists('dd')) { function dd(...$vars) { foreach ($vars as $v) { VarDumper::dump($v); } exit(1); } }
如果我们想打印结果且中断程序执行,dd()函数是一个非常好的选择。
如果我们想打印结果但是不想中断程序执行可以用 dump():
collect(['John Doe', 'Jane Doe'])->dump();
返回原集合中存在而指定集合中不存在的值
collect([1, 2, 3])->diff([2, 4]); 结果:[1, 3]
返回集合中 与指定集合键值对 不一致的数据
这个就非常好用了
collect(['color' => 'orange', 'remain' => 6])->diffAssoc(['color' => 'yellow', 'remain' => 6, 'used' => 6]); 结果是:['color' => 'orange']
返回原集合中存在,而指定集合中不存在键,所对应的键 / 值对
collect(['one' => 10, 'two' => 20])->diffKeys(['two' => 2, 'four' => 4]); 结果: ['one' => 10]
遍历集合中的项目,并将之传入给定的回调函数:
$collection = $collection->each(function ($item, $key) {});
验证集合中的每一个元素是否通过指定的条件测试
collect([1, 2])->every(function ($value, $key) { return $value > 1; }); 结果:false
返回集合中排除指定键的所有项目:
$collection->except(['xxx', 'yyy']);