laravel
集合
collect 会为指定的数组返回一个新的实例,创建一个集合
$collection = collect([1,2,3]);
扩展集合
集合都是 宏观的,他允许您在执行时将其他方法添加到 collection类。例如,通过下面的代码在collection类中
添加一个tuUpper方法;
use Illuminate\Support\Str
Collection:macro('toUpper',function(){
return $this->map(function($value){
return Str::upper($value);
})
});
$collection = collect(['first','second']);
$upper = $collection->toUpper();
可用方法
接下来的文档内容,我们会探讨 collection类的每个方法。记住,所有方法都可以通过链式访问的形式优雅的操作数组。而且,几乎所有的方法都会返回一个新的 collection实例,允许你在必要是保存集合的原始副本;
方法列表
all()
all 方法返回该集合表示的底层数组
collect([1,2,3])->all();
average() avg 方法的别名 返回给定的平均值
$average = collect(...)->avg();
chunk 方法将集合拆成多个指定大小的小集合
$collection->chunk(4);
collapse 将多个数组的集合合并成一个数组的集合:
$collection->collapse();
combine() 可以将一个集合的值作为键,在将另一个数组或者集合的值作为值合并成一个集合
$collection->combine(['city',12]);
concat 将给定的数组或集合值附加到集合的末尾
$collection->concat(['jane doe'])
contains 判断集合是否包含给定的项目
$collection->contains('New York');
也可以用 contains 匹配一对键值对,即判断给定的配对是否存在于集合中
$collection->contains('product','Bookcase')
也可以传递一个回调到contains方法来执行自己的真实测试
$collection->contains(function($value,$key){
return $value > 5;
});
contains 方法在检查项目制值时使用宽松比较,意味着具有整数值的字符串将被视为等于相同值的整数。相反containsStrict 方法则是使用 严格 比较进行过滤。
count 返回该集合内的项目总数
$collection->count();
crossJoin() 交叉连接给定数组或集合的值,返回所有可能排列的笛卡尔积;
->crossJoin(['a','b']);
dd 将打印集合的项目并结束脚本执行
->dd();
如果不行终止脚本执行,请使用 dump 方法代替
diff 将集合与其他集合或纯PHP数组进行值的比较,然后返回原集合中存在而在给定集合中不存在的值
->diff([2,3,4]);
diffAssoc()
该方法与另外一个集合或基于它的键和值的PHP数组进行比较。这个方法会返回集合不存在于给定集合中的键值对:
diffkeys()
此方法与另外一个集合或PHP数组的键进行比较,然后返回原集合中存在而给定的集合中不存在键所对应的键值对
dump 方法打印集合的项目
each 迭代集合中的内容并将其传递到回调函数中
->each(function($item,$key){
//
});
如果你想要中断对内容的迭代,那就从回调中返回false
->each(function($item,$key){
if(){
return false;
}
});
eachSpread() 方法迭代集合的项目,将每个嵌套项目的值传递给回调;
->eachSpread(function($name,$age){
//
});
你可以通过在回调中返回 false 来终止迭代
every() 方法可用于验证集合中每一个元素都通过给定的真实测试
->every(function($value,$key){
return $value > 2;
});
except 方法返回集合中除了指定键以外的所有项目
->except(['price','discount']);
与except 相反的方法,是 only
filter 方法使用给定的回调函数过滤集合的内容,只留下那些通过给定真实测试的内容;
->filter(function($value,$key){
return $value > 2;
});
如果没有提供回调函数,集合中所有false 的元素都会被移除;
与 filter相反的方法,可以查看 reject
first方法返回集合中通过给定真实测试的第一个元素
->first(function($value,$key){
rerturn $value > 2;
});
你也可以不传入从参数使用 first 方法以获取集合中的第一个原色,如果集合是空的,则会返回null
collect([1,2,3])->first();
firstWhere() 方法返回集合中具有给定键值对的第一个元素
->firstWhere('name','Linda');
此方法还可以使用运算符
->firstWhere('age','>=',18);
flatMap 方法遍历集合并将其中的每个值传递到给定的回调,可以通过回调修改每个值的内容在返回出来,从而形成一个新的被修改过内容的集合,然后再次被合并为一个数组的集合;
flatten() 将多维集合转为一维的
->flatten();
flip 将集合中的键和对应的数值进行互换
->flip()
forget() 通过给定的键来移除掉集合中对应的内容
forPage 返回给定页码上显示的项目的新集合,这个方法接受页码作为其第一个参数和每页显示的项目数作为其第二个参数
->forPage(2,3);
get 返回给定键的项目,如果该键不存在 则返回null
->get('name');
也可以选择性的传递默认值作为第二个参数
->get('foo','default-value');
也可以将回调函数当做默认值,如果指定的键不存在,就会返回回调的结果
->get('email',function(){
return 'default-value';
});
groupBy 根据给定的键对集合内的项目进行分组
->groupBy('account_id');
除了传入一个字符串的键 你还可以传入一个回调,该回调应该返回你希望用来分组的键等值、
->groupBy(function ($item,$key){
return substr($item['account_id'],-3);
});
多个分组标准可以作为数组传递,每个数组元素将应用于多维数组的对应级别
$result = $data->groupBy(
'skill',
function ($item){
return $item['roles'];
},$preservekeys = true);
has 方法判断集合中是否存在给定的键
->has('product');
implode 合并集合中的项目,其参数取决于集合中项目的类型,如果集合包含数组或对象,
你应该传入你希望链接的属性的键,以及你希望放在值之间用来拼接的字符串
->implode('product',',');
如果集合包含简单的字符串或数值,只需要传入 拼接用的字符串作为该方法的唯一参数即可
->implode('-');
intersect 方法从原集合中删除不在给定数组或集合中的任何值,最终的集合会保留原集合的键;
->intersect(['Desc','Chair',‘Bookcar’,]);
intersectByKeys() 删除原集合中不存在于给定数组或集合中的任何键
isEmpty 如果集合是空的, 返回true 否则返回false
->isEmpty();
isNotEmpty 如果集合不是空的,会返回true; 否则返回false
->isNotEmpty();
keyBy() 以给定的键作为集合的键,如果多个项目具有相同的键,则只有最后一个项目回显示在新集合中
->keyBy('product_id');
也可以传入一个回调方法,回调方法返回的值会作为该集合的键
->keyBy(function ($item){
return strtoupper($item['product_id']);
})
keys 方法会返回集合的所有键
->keys();
last 返回集合中通过给定真值测试的最后一个元素
->last(function($value,$key){
return $value < 3;
})
如果不传入参数调用last 来获取集合中最后一个元素 如果集合是空的,则返回null
->last()
macro 允许你在运行时将方法添加到 colection 类中
make 可以创建一个新的集合实例
map 方法遍历集合并将每一个值传入给定的回调方法,该回调可以任意修改项目并返回,从而形成新的被修改过项目的集合;
->map(function($item,$key){
return $item * 2;
});
mapInto 可以迭代集合,通过将值传递给构造函数来创建给定类的新实例;
->mapIinto(Currency::class);
mapSpread 可以迭代集合的项目,将每个嵌套项目值给定的回调函数,该回调函数可以自由修改该项目并将其返回,从而形成新的修改过的项目集合
->mapSpread(function($odd,$even){
return $odd + $even;
});
mapToGroups 通过给定的回调方法对集合的项目进行分组,该回调应该返回一个包含单个键值对的关联数组,从而形成一个新的集合
->mapToGroups(function($item,$key){
return [$item['department']=>$item['name']];
});
mapWithKeys 方法遍历集合并将每个值传递给回调,回调会返回一个包含单个键值对的关联数组
->mapWithKeys(function ($item){
return [$item['email']=>$item['name']];
})
max 方法返回给定键的最大值
->max();
median 方法返回给定键的中值
->median();
merge 方法将合并给定的数组或集合到原集合,如果给定项目中国的字符串键与原集合中的字符串键相匹配,给定的项目值
将覆盖原集合中的值
->merge(['price'=>200]);
min 返回给定键的最小值
->min();
mode 返回给定键的众数
nth 创建由每隔n个元素组成的一个的新集合
->nth(4);
你也可以选择传入一个偏移位置作为第二个参数
->nth(4,1)
only 返回集合中所有给定键的所有项目
->only(['product_id','name']);
与only相反的方法,是 except
pad 方法将使用给定的值填充数组,直到数组达到指定的大小,此方法的行为与array_pad 函数功能类似
->pad(5,0);
->pad(-5,0);
partition 此方法可以和php中的list方法结合使用,用来分开通过指定条件的元素以及那些不通过指定条件的元素
->partition(function(){
return $i < 3;
});
pipe 将集合传给给定的回调并返回结果
->pipe(function($collection){
return $collection->sum();
});
plunk 方法可以获取集合中给定键对应的所有值
->pluck('name');
也可用通过传入第二个参数来指定生成的集合的键
->pluck('name','product_id');
如果存在重复的键,则最后一个匹配元素将被插入到弹出的集合中
->pluck('color','brand');
pop 从集合中移除并返回最后一个项
->pop();
perpend 方法给定的值添加到集合的开头
->prepend(0);
也可以传递第二个参数来设置新增加项的键
->prepend(0,'zero');
pull 方法把给定键对应的值从集合中移除并返回;
->pull('name');
push 把给定值添加到集合的末尾
->push(5);
put 在集合内设置给定的键值对
->put('price',100);
random 方法从集合中返回一个随机项;
->random();
reduce 将每次迭代的结果传递给下一次迭代直到集合减少为单个值
->reduce(function($carry,$item){
return $carry + $item;
});
第一次迭代时 $carry 的数组为null,然而,你也可以通过传入第二个参数到reduce来指定它的初始值
->reduce(function($carry,$item){
return $carry + $item;
},4);
reject 使用指定的回调过滤集合,如果回调返回 true 就会把对应的项目从集合中移除
->reject(function($value,$key){
return $value > 2;
});
reverse 方法用来倒转集合中项目的顺序,并保留原始的键
->reverse();
search 方法搜索给定的值并返回它的键,如果找不到,则返回false
->search(4);
搜索使用 宽松模式比较完成的,这意味着具有整数值的字符串会被认为等于相同值的整数,要使用严格模式
来比较 就传入true作为该方法的第二个参数
->search('4',true);
另外,你可以通过回调来搜索第一个真实测试的项目
->search(function($item,$key){
return $item > 5;
})
shift 方法移除并返回集合的第一个项目
->shift();
shuffle 方法随机排序集合中的项目
->shuffle();
slice 返回集合中给定索引开始后面的部分
->slice(4)
如果你想限制返回内容的大小,就将期望的大小作为第二个参数传递给方法
->slice(4,2);
默认情况下,返回的内容将会保留原始键,假如你不希望保留原始的键,你可以使用 values 来
重新建立索引
sort 对集合进行排序,排序后的集合保留着原数组的键,所以在这个例子中我们使用values 来
把键重置为连续编号的索引
->sort()
sortBy() 通过给定的键对集合进行排序,排序后的集合保留了元数组键,所以在这个例子中,我们使用 vlaues方法将键重置为连续编号的索引
->sortBy('price');
还可以传入自己的回调以决定如何对集合的值进行排序
->sortBy(function($product,$key){
return count($product['colors']);
});
sortByDesc 此方法与sortBy方法一样,但是会以相反的顺序来对集合进行排序。
sortKeys() 方法通过底层关联数组的键来排序集合
->sortKeys()
sortKeysDesc() 此方法与 sortKeys 方法一样,但是会以相反的顺序来对集合进行排序
splice 删除并返回给定值后的内容,原集合也会受到影响
->splice(2);
可以传入第二个参数以限制被删除内容的大小
->splice(2,1);
可以传入含有新项目等第三个参数来代替集合中删除的项目:
->splice(2,1,[10,11]);
split() 将集合按给定的值拆分
->split(3);
sum 返回集合内所有项的中和;
->sum();
如果集合包含嵌套数组或对象,则应该传入一个键来指定要进行求和的值:
->sum('pages');
另外,你也可以传入回调来决定要用集合中的那些值进行求和
->sum(function($product){
return count($product['colors']);
});
take 此方法返回给定数量项的新集合
->take(3);
你可以传递负整数从集合末尾获取指定数量的项:
->take(-2);
tap 将集合传递给回调,在特定点 tap 集合,此举能让你对集合中的项目执行某些操作,而不影响集合本身
times 通过回调在给定次数内创建一个新的集合
Collcetion::times(10,function($number){
return $number * 9;
});
toAraay()
将集合转换成PHP数组,如果集合的值是 Eloquent模型,也会被转换成数组
->toArray();
toJson 方法将集合转换成JSON字符串
->toJson();
transform() 迭代集合并对集合内的每个项目调用给定的回调,而集合的内容也会被回调返回的值取代
->transform(function($item,$key){
return $item * 2;
});
union 方法将给定的数组添加到集合中,如果给定的数组中含有与原集合一样的键,则原集合的值不会被改变;
->union([3=>['c']]);
unique 方法返回集合中的所有唯一的项目,返回的集合保留着原数组的键,所以在这个例子中,我们使用values 方法来吧键重置为连续编号的索引:
->unique();
在处理嵌套数组或对象是,你可以指定用来确定唯一性的键
->unique('brand');
你还可以通过自己的回调来确定项的唯一性
->unique(function($item){
return $item['brand'].$item['type'];
});
uniqueStrict 此方法做严格模式的比较
unless 当传入的第一个参数不为 true的时候,将执行给定的回调
->unless(false,function(){});
when 此方法与 unless方法相反
unwrap 返回集合内部的可用值
Collection::unwrap(['John Doe']);
values 此方法返回键被重置为连续编号的新集合
->values();
when 此方法当传入的第一个参数为true的时候,将执行给定的回调
where 方法通过给定的键值过滤集合
->where('price',100);
whereStrict 会严格的匹配所有值
whereIn 方法通过给定的键值对数组进行过滤集合
->whereIn('price',[150,200]);
whereInStrice() 严格匹配
whereInstanceOf 此方法通过指定类来过滤指定的集合
->whereInstanceOf(User::class);
whereNotIn 方法通过指定不包含在集合中的键值对数组进行过滤
->whereNotIn('price',[150,200]);
whereNotInStrict 严格
wrap 静态调用此方法将可用的给定值包装在集合中
Collection::wrap('John Doe');
zip 将给定数组的值和相应索引的原集合的值合并在一起
->zip([100,200]);
高阶消息传递
集合也提供对 高阶消息传递的支持,即集合常见操作的快捷方式,支持高阶消息传递的集合方法又 average avg contains each every filter first flatMap
groupBy keyBy map max min partition reject sortBy sortByDesc sum and unique
每个高阶消息传递都能作为集合实例的动态的属性来访问。例如,使用each 高阶消息传递在集合中的每个对象上调用一个方法;
User::where('votes',‘>’,500)->get();