在 Laravel 中 10 个常用的集合方法

发布日期 2022-06-07

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

站长:SevDot


SevDot 的头像

微信公众号