Laravel 集合操作总结

简介

  1. Illuminate\Support\Collection 类提供一个流畅、便利的封装来操控数组数据,支持链式调用。
  2. 绝大多数 collection 方法会返回一个新的集合、元素、统计数据,小部分会修改原有集合。

基本用法

  1. 创建

    $collection = collect([1, 2, 3]);
  2. 统计类方法

    # 求个数
    $collection->count();
    $collection->count(1); // 递归模式
    
    # 求平均
    $collection->avg();
    $collection->avg('<键名>'); // 多维
    
    # 求和
    $collection->sum();
    $collection->sum('<键名>'); // 多维
    
    # 求最大值
    $collection->max();
    $collection->max('<键名>'); // 多维
    
    # 求最小值
    $collection->min();
    $collection->min('<键名>'); // 多维
    
  3. 筛选类方法

    # 第一个元素
    $collection->first();
    # 第一个通过测试的元素
    $collection->first(function( $key, $value ){
        return <条件判断>
    });
    # 注:集合为空,返回 null
    
    # 最后一个元素
    $collection->last();
    # 最后一个通过测试的元素
    $collection->last(function( $key, $value ){
        return <条件判断>
    });
    # 注:集合为空,返回 null
    
    # 搜索数值,找到返回键值,未找到返回 false
    $collection->search(<搜索值>);
    # 严格模式搜索,比较值和类型
    $collection->search(<搜索值>, true);
    # 回调搜索
    $collection->search(function( $item, $key ){
        return <条件判断>
    });
    
    # 多维数组筛选,返回元素
    $collection->where( <键名>, <键值>, [ $strict = true ] ); // 默认严格模式
    $collection->whereLoose( <键名>, <键值> ); // 宽松模式
    $collection->whereIn( <键名>, <键值数组>, [ $strict = true ] ); // 默认严格模式
    $collection->whereInLoose( <键名>, <键值数组> ); // 宽松模式
    
    # 获取唯一的元素
    $collection->unique(); // 一维
    $collection->unique( <键名> ); // 多维
    $collection->unique( function( $item ){
        return <确定是否唯一的值>;
    } );
    
  4. 获取新集合类方法

    # 所有底层数组
    $collection->all();
    
    # 获取指定键的值
    $collection->get(<>, [<默认值|匿名函数>]);
    
    # 获取单列
    $collection->pluck(<列名>, [ <> ])
    
    # 键名重新生成
    $collection->values();
    
    # 键名成新集合
    $collection->keys();
    
    # 设置集合的键名
    $collection->keyBy(<列名>);
    
    # 键值互换
    $collection->flip();
    
    # 返回新的随机排序的集合
    $collection->shuffle();
    
    # 返回新的倒序的集合
    $collection->reverse();
    
    # 与其他集合合并
    $collection->union(<集合>);
    
    # 不在指定范围内的移除
    $collection->intersect(<数组|集合>); // 结果会保留原键值
    # 不在指定范围内的键名移除
    $collection->intersectByKeys(<数组|集合>); // 结果会保留原键值
    
    # 返回从索引起的切片
    $collection->slice( <索引>, [ <切片长度> ] );
    # 注释:索引可以为负数,长度不填默认至最后一个元素
    
    # 一维集合排序
    $collection->sort( [ function( $a, $b ){
        return < -1 | 1 | 0 >;
    } ] );
    # 注:不传回调函数,则默认由小到大
    
    # 多维集合排序
    $collection->sortBy( <列名> ) // 以某列排序
    $collection->sortBy( function( $item, $key ){
        return <参于排序的数>;
    } )
    # 注:排序从小到大依次为 undefined、字符或字符串、数字、数组对象
    #     同为 undefined ,先出现的在前
    #     同为 字符或字符串 ,一个字符一个字符比较其 Ascii 码
    #     同为 数组或对象 ,比较其元素个数
    
    # 多维集合排序倒序,性质同 `sortBy`
    $collection->sortByDesc();
    
    # 取指定数量的元素的集合
    $collection->take( <数量> );
    # 注:数量为负数,表示从末尾取
  5. 判断类方法

    # 是否为空
    $collection->isEmpty();
    
    # 是否含有指定值
    $collection->contains( <键值> );
    $collection->contains( <键名>, <键值> );  // 多维
    $collection->contains(function( $key, $value ){
        return <判断条件>
    });
    
    # 是否含有指定的键
    $collection->has( <键名> );
  6. 维度变化方法

    # 集合元素拼接
    $collection->implode( <拼接字符> ); // 一维
    $collection->implode( <键名>, <拼接字符> ); // 多维中的某列
    
    # 按个数拆分成多维
    $collection->chunk( <每个小集合元素个数> );
    
    # 多维合并为一维
    $collection->collapse();
    # 注:对于 item 不是数组的,会被丢弃
    
    # 合并键值对(集合值作为键,另一集合或数组作为对应值)
    $collection->combine( <值数组> );
    # 注:集合与另一集合或集合必须保持相同的元素个数
    #     合并结果可能会由于集合有相同的值作为键值而个数减小
    #     后出现的会覆盖前面出现的
    collect([ 1, 2, '1' ])->combine([ 'a', 'b', 'c' ]);
    // [ 1 => 'c', 2 => 'b' ]
    
    # 索引合并
    $collection->zip( <新数组> );
    collect([ 1, 2 ])->zip([ 'a', 'b' ]);
    // [ [ 1, 'a' ], [ 2, 'b' ] ]
  7. 遍历类方法

    # 遍历
    $collection->each(function ($item, $key) {
        <...>
    });
    注:回调函数中,返回 false 会终止遍历
    
    # 遍历返回,形成新的集合
    $collection->map(function ($item, $key) {
        <...>
        return <新的元素>;
    });
    
    # 遍历修改,*直接更改了原有集合*
    $collection->transform(function ($item, $key) {
        <...>
        return <元素的新值>;
    });
    
    # 遍历执行回调,最后转为一维集合返回
    $collection->flatMap(function( $item, $key ){
        return <新的元素>;
    });
    # 注:等价于 ->map()->collapse();
    
    # 集合与数组合并
    $collection->union( <数组> );
    # 注:若集合与数组具有相同的键名,集合的将会保留,性质类同于 `+`
  8. 集合元素增删改

    # 移除并返回第一个元素
    $collection->shift();
    
    # 从索引起切除一段后返回
    $collection->splice( <索引>, [ <切片长度> ] );
    # 注:性质同 `slice`,不同的地方在于 `slice` 不会更改原有集合
    $collection->splice( <索引>, [ <切片长度> ], [ <切去的要替换成的元素数组> ] );
    # 注:传入含有新元素的数组作为第三个参数以取代集合中被移除的元素
  9. 转化类方法

    # 转化为数组
    $collection->toArray();
    # 注:`toArray` 也会转换所有内嵌的对象为数组。`all` 只会转化底层数组
    
    # 转化为Json
    $collection->toJson();

参考资料

https://docs.golaravel.com/docs/5.3/collections/