Laravel 中 Illuminate\Support\Collection
类为处理数据数组提供了一个流畅、方便的包装器,这篇文章与你分享 10 个在实际开发中我经常用到的,觉得很好用的集合方法。
pluck
pluck
方法可以获取集合中指定键对应的所有值:
$collection = collect([
['product_id' => 'prod-100', 'name' => 'Desk'],
['product_id' => 'prod-200', 'name' => 'Chair'],
]);
$plucked = $collection->pluck('name');
$plucked->all();
// ['Desk', 'Chair']
在实际开发中,经常使用 pluck
方法来取查询出来的数据中某字段的所有值,比如取出所有用户的 ID 数组:
$users = User::all();
$ids = $users->pluck('id')->toArray();
你也可以通过传入第二个参数来指定生成集合的 key(键):
$plucked = $collection->pluck('name', 'product_id');
$plucked->all();
// ['prod-100' => 'Desk', 'prod-200' => 'Chair']
map
map
方法遍历集合并将每一个值传入给定的回调函数。该回调函数可以任意修改集合项并返回,从而生成被修改过集合项的新集合:
$collection = collect([1, 2, 3, 4, 5]);
$multiplied = $collection->map(function ($item, $key) {
return $item * 2;
});
$multiplied->all();
// [2, 4, 6, 8, 10]
实际上,map
方法在处理二维数组的时候,可以达到 pluck
方法的功能:
$collection = collect([
['product_id' => 'prod-100', 'name' => 'Desk'],
['product_id' => 'prod-200', 'name' => 'Chair'],
]);
$multiplied = $collection->map(function ($item, $key) {
return $item->name;
});
$multiplied->all();
// ['Desk', 'Chair']
filter
filter
方法使用给定的回调过滤集合,只保留那些通过给定真值测试的项目:
$collection = collect([1, 2, 3, 4]);
$filtered = $collection->filter(function ($value, $key) {
return $value > 2;
});
$filtered->all();
// [3, 4]
如果没有提供回调,则集合中所有相当于 false
的条目都将被删除:
$collection = collect([1, 2, 3, null, false, '', 0, []]);
$collection->filter()->all();
// [1, 2, 3]
some
some
方法可用于验证集合中是否有一个元素满足给定的真值测试:
collect([1, 2, 3, 4])->every(function ($value, $key) {
return $value > 2;
});
// ture
如果不使用 some
方法,你可能需要循环来实现:
$arr = [1,2,3,4]
foreach($arr as $value){
if($value > 2){
return ture;
}
}
every
every
方法可用于验证集合的所有元素是否通过给定的真值测试:
collect([1, 2, 3, 4])->every(function ($value, $key) {
return $value > 2;
});
// false
every
方法与 some
方法的用途是一样的,都是用来验证集合的元素是否满足给定条件,区别是 every
方法是所有元素都满足条件才返回 ture
,而 some
方法只需要有一个元素满足条件就返回 ture
。
except
except
方法返回集合中除了具有指定键的项目:
$collection = collect(['product_id' => 1, 'price' => 100, 'discount' => false]);
$filtered = $collection->except(['price', 'discount']);
$filtered->all();
// ['product_id' => 1]
only
only
方法与 except
方法相反,only
返回集合中具有指定键的项目:
$collection = collect([
'product_id' => 1,
'name' => 'Desk',
'price' => 100,
'discount' => false
]);
$filtered = $collection->only(['product_id', 'name']);
$filtered->all();
// ['product_id' => 1, 'name' => 'Desk']
first
first
方法返回集合中通过给定真值测试的第一个元素:
collect([1, 2, 3, 4])->first(function ($value, $key) {
return $value > 2;
});
// 3
你也可以调用不带参数的 first
方法来获取集合中的第一个元素。 如果集合为空,则返回 null
:
collect([1, 2, 3, 4])->first();
// 1
random
random
方法从集合中返回一个随机项:
$collection = collect([1, 2, 3, 4, 5]);
$collection->random();
// 4
您可以将一个整数传递给 “random”,以指定要随机检索的项目数。 当明确传递您希望接收的项目数时,始终返回项目集合:
$random = $collection->random(3);
$random->all();
// [2, 4, 5]
reduce
reduce
方法将集合减少为单个值,将每次迭代的结果传递给后续迭代:
$collection = collect([1, 2, 3]);
$total = $collection->reduce(function ($carry, $item) {
return $carry + $item;
});
// 6
$carry
在第一次迭代时的值为 null
; 但是,您可以通过将第二个参数传递给 reduce
来指定其初始值:
$total = $collection->reduce(function ($carry, $item) {
return $carry + $item;
}, 4);
// 10
可以看到,使用reduce
方法实现累加、累积等功能很方便,处理二维数组也很方便:
$collection = collect([
['id' => 1, 'age' => 12],
['id' => 2, 'age' => 15],
['id' => 3, 'age' => 18]
]);
$total = $collection->reduce(function ($carry, $item) {
return $carry + $item['age'];
});
// 45