集合

收藏727

阅读118018

更新时间2022-04-15

前言:

集合

集合

简介

Illuminate\Support\Collection 类提供了一个更具可读性和更便于处理数组数据的封装。具体例子请查看下面代码。我们使用 collect 辅助函数从数组中创建一个新的集合实例,对其中每一个元素执行 strtoupper 函数之后再删除所有的空元素:

$collection = collect(['taylor', 'abigail', null])->map(function ($name) { 
   return strtoupper($name);
})->reject(function ($name) { 
   return empty($name);
});

正如你所见, Collection 类允许你链式调用其它方法,以达到在底层数组上流畅的执行 map 和 reduce 操作,通常,集合是不可变的,这意味着每一个 Collection 方法都会返回一个新的 Collection 实例。

创建集合

如上所述, collect 辅助函数会为指定的数组返回一个新的 Illuminate\Support\Collection 实例。因此,我们可以这样轻松的创建一个集合:

$collection = collect([1, 2, 3]);

{tip} 通常,Eloquent 查询的结果返回的内容都是 Collection 实例。

扩展集合

集合都是「可宏扩展」(macroable) 的,它允许你在执行时将其它方法添加到 Collection 类。例如,通过下面的代码在 Collection 类中添加一个 toUpper 方法:

use Illuminate\Support\Str;Collection::macro('toUpper', function () { 
   return $this->map(function ($value) {  
         return Str::upper($value);    
       });
 });$collection = collect(['first', 'second']);
 $upper = $collection->toUpper();
 // ['FIRST', 'SECOND']

通常,你应该在 服务提供者 内声明集合宏。

可用方法

接下来的文档内容,我们会探讨 Collection 类的每个方法。请牢记,所有方法都可以通过链式访问的形式优雅的操作数组。而且,几乎所有的方法都会返回一个新的 Collection 实例,允许你在必要时保存集合的原始副本:

方法列表

all()

all 方法返回该集合表示的底层数组:

collect([1, 2, 3])->all();// [1, 2, 3]

average()

avg 方法的别名。

avg()

avg 方法返回给定键的 平均值

$average = collect([['foo' => 10],
             ['foo' => 10], 
            ['foo' => 20], 
            ['foo' => 40]])->avg('foo');
// 20
$average = collect([1, 1, 2, 4])->avg();
// 2

chunk()

chunk 方法将集合拆成多个给定大小的小集合:

$collection = collect([1, 2, 3, 4, 5, 6, 7]);
$chunks = $collection->chunk(4);
$chunks->toArray();
// [[1, 2, 3, 4], [5, 6, 7]]

这个方法在使用网格系统的 视图 中特别适用,例如 Bootstrap。 想象你有一个 Eloquent 模型的集合要在网格中显示:

@foreach ($products->chunk(3) as $chunk)  
  
        @foreach ($chunk as $product)         
           
              {{ $product->name }}
           
        @endforeach       
 @endforeach

collapse()

collapse 方法将多个数组的集合合并成一个数组的集合:

$collection = collect([[1, 2, 3], [4, 5, 6], [7, 8, 9]]);
$collapsed = $collection->collapse();
$collapsed->all();
// [1, 2, 3, 4, 5, 6, 7, 8, 9]

combine()

combine 方法可以将一个集合的值作为键,再将另一个数组或集合的值作为值合并成一个集合:

$collection = collect(['name', 'age']);
$combined = $collection->combine(['George', 29]);
$combined->all();
// ['name' => 'George', 'age' => 29]

concat()

concat 方法将给定的 数组 或集合值追加到集合的末尾:

$collection = collect(['John Doe']);
$concatenated = $collection->concat(['Jane Doe'])->concat(['name' => 'Johnny Doe']);
$concatenated->all();
// ['John Doe', 'Jane Doe', 'Johnny Doe']

contains()

contains 方法判断集合是否包含指定的集合项:

$collection = collect(['name' => 'Desk', 'price' => 100]);
$collection->contains('Desk');
// true
$collection->contains('New York');
// false

你也可以使用 contains 方法传递一组键 / 值对,可以判断该键 / 值对是否存在于集合中:

$collection = collect([
    ['product' => 'Desk', 'price' => 200],    
    ['product' => 'Chair', 'price' => 100],
]);
$collection->contains('product', 'Bookcase');
// false

最后,你也可以用 contains 方法传递一个回调函数来执行自己的真实测试:

$collection = collect([1, 2, 3, 4, 5]);
$collection->contains(function ($value, $key) {
    return $value > 5;
  });
// false

contains 方法在检查集合项的值时使用「宽松」比较,这意味着具有整数值的字符串将被视为等于相同值的整数。相反 containsStrict 方法则是使用「严格」比较进行过滤。

containsStrict()

这个方法和 contains 方法类似,但是它却是使用了「严格」比较来比较所有的值。

count()

count 方法返回这个集合内集合项的总数量:

$collection = collect([1, 2, 3, 4]);
$collection->count();
// 4

crossJoin()

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

$collection = collect([1, 2]);
$matrix = $collection->crossJoin(['a', 'b']);
$matrix->all();
/*
    [
        [1, 'a'],
        [1, 'b'],
        [2, 'a'],
        [2, 'b'],
    ]
*/
$collection = collect([1, 2]);
$matrix = $collection->crossJoin(['a', 'b'], ['I', 'II']);
$matrix->all();
/*
    [
        [1, 'a', 'I'],
        [1, 'a', 'II'],
        [1, 'b', 'I'],
        [1, 'b', 'II'],
        [2, 'a', 'I'],
        [2, 'a', 'II'],
        [2, 'b', 'I'],
        [2, 'b', 'II'],
    ]
*/

dd()

dd 方法用于打印集合项并中断脚本执行:

$collection = collect(['John Doe', 'Jane Doe']);
$collection->dd();
/*
    Collection {
        #items: array:2 [
            0 => "John Doe"
            1 => "Jane Doe"
        ]
    }
*/

如果你不想中断执行脚本,请使用 dump 方法代替。

diff()

diff 方法将集合与其它集合或纯 PHP 数组 进行值的比较。然后返回原集合中存在而指定集合中不存在的值:

$collection = collect([1, 2, 3, 4, 5]);
$diff = $collection->diff([2, 4, 6, 8]);
$diff->all();
// [1, 3, 5]

diffAssoc()

diffAssoc 方法与另外一个集合或基于它的键和值的 PHP 数组 进行比较。这个方法将会返回原集合不存在于指定集合的键 / 值对:

$collection = collect([ 
   'color' => 'orange',    
   'type' => 'fruit',    
   'remain' => 6
   ]);
$diff = $collection->diffAssoc([ 
   'color' => 'yellow',    
   'type' => 'fruit',    
   'remain' => 3,    
   'used' => 6
   ]);
  $diff->all();
 // ['color' => 'orange', 'remain' => 6]

diffKeys()

diffKeys 方法和另外一个集合或 PHP 数组 的键进行比较,然后返回原集合中存在而指定集合中不存在键所对应的键 / 值对:

$collection = collect([
    'one' => 10,    
    'two' => 20,    
    'three' => 30,    
    'four' => 40,    
    'five' => 50,
   ]);
$diff = $collection->diffKeys([
    'two' => 2,    
    'four' => 4,    
    'six' => 6,    
    'eight' => 8,
   ]);
$diff->all();
// ['one' => 10, 'three' => 30, 'five' => 50]

dump()

dump 方法用于打印集合项:

$collection = collect(['John Doe', 'Jane Doe']);
$collection->dump();
/*
    Collection {
        #items: array:2 [
            0 => "John Doe"
            1 => "Jane Doe"
        ]
    }
*/

如果要在打印集合后终止执行脚本,请使用 dd 方法代替。

each()

each 方法用于循环集合项并将其传

精选课程

更多
前端入门_HTML5
前端入门_HTML5

共29课时

61.7万人学习

CSS视频教程-玉女心经版
CSS视频教程-玉女心经版

共25课时

39.3万人学习

JavaScript极速入门_玉女心经系列
JavaScript极速入门_玉女心经系列

共43课时

70.9万人学习

独孤九贱(1)_HTML5视频教程
独孤九贱(1)_HTML5视频教程

共25课时

61.6万人学习

独孤九贱(2)_CSS视频教程
独孤九贱(2)_CSS视频教程

共22课时

23万人学习

独孤九贱(3)_JavaScript视频教程
独孤九贱(3)_JavaScript视频教程

共28课时

33.9万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时

125万人学习

关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号