介绍

php Illuminate\Support\Collection 类为处理数据数组提供了一个流畅、方便的包装器。 例如,查看以下代码。 我们将使用 php collect 助手从数组中创建一个新的集合实例,对每个元素运行 php strtoupper 函数,然后删除所有空元素:

  1. $collection = collect(['taylor', 'abigail', null])->map(function (string $name) {
  2. return strtoupper($name);
  3. })->reject(function (string $name) {
  4. return empty($name);
  5. });

如你所见,php Collection 类允许你链接其方法以执行流畅的映射和减少底层数组。一般来说,集合是不可变的,这意味着每个 php Collection 方法都会返回一个全新的 php Collection 实例。

创建集合

如上所述,php collect 帮助器为给定数组返回一个新的 php Illuminate\Support\Collection 实例。因此,创建一个集合非常简单:

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

技巧:Eloquent 查询的结果总是作为 php Collection 实例返回。

扩展集合

集合是「可宏化的」,它允许你在运行时向 php Collection 类添加其他方法。 php Illuminate\Support\Collection 类的 php macro 方法接受一个闭包,该闭包将在调用宏时执行。宏闭包可以通过 php $this 访问集合的其他方法,就像它是集合类的真实方法一样。例如,以下代码在 php Collection 类中添加了 php toUpper 方法:

  1. use Illuminate\Support\Collection;
  2. use Illuminate\Support\Str;
  3. Collection::macro('toUpper', function () {
  4. return $this->map(function (string $value) {
  5. return Str::upper($value);
  6. });
  7. });
  8. $collection = collect(['first', 'second']);
  9. $upper = $collection->toUpper();
  10. // ['FIRST', 'SECOND']

通常,你应该在服务提供者的 php boot 方法中声明集合宏。

宏参数
如有必要,可以定义接受其他参数的宏:

  1. use Illuminate\Support\Collection;
  2. use Illuminate\Support\Facades\Lang;
  3. Collection::macro('toLocale', function (string $locale) {
  4. return $this->map(function (string $value) use ($locale) {
  5. return Lang::get($value, [], $locale);
  6. });
  7. });
  8. $collection = collect(['first', 'second']);
  9. $translated = $collection->toLocale('es');

可用的方法

对于剩余的大部分集合文档,我们将讨论 php Collection 类中可用的每个方法。请记住,所有这些方法都可以链式调用,以便流畅地操作底层数组。此外,几乎每个方法都会返回一个新的 php Collection 实例,允许你在必要时保留集合的原始副本:

all
average
avg
chunk
chunkWhile
collapse
collect
combine
concat
contains
containsOneItem
containsStrict
count
countBy
crossJoin
dd
diff
diffAssoc
diffKeys
doesntContain
dump
duplicates
duplicatesStrict
each
eachSpread
every
except
filter
first
firstOrFail
firstWhere
flatMap
flatten
flip
forget
forPage
get
groupBy
has
hasAny
implode
intersect
intersectAssoc
intersectByKeys
isEmpty
isNotEmpty
join
keyBy
keys
last
lazy
macro
make
map
mapInto
mapSpread
mapToGroups
mapWithKeys
max
median
merge
mergeRecursive
min
mode
nth
only
pad
partition
pipe
pipeInto
pipeThrough
pluck
pop
prepend
pull
push
put
random
range
reduce
reduceSpread
reject
replace
replaceRecursive
reverse
search
shift
shuffle
skip
skipUntil
skipWhile
slice
sliding
sole
some
sort
sortBy
sortByDesc
sortDesc
sortKeys
sortKeysDesc
sortKeysUsing
splice
split
splitIn
sum
take
takeUntil
takeWhile
tap
times
toArray
toJson
transform
undot
union
unique
uniqueStrict
unless
unlessEmpty
unlessNotEmpty
unwrap
value
values
when
whenEmpty
whenNotEmpty
where
whereStrict
whereBetween
whereIn
whereInStrict
whereInstanceOf
whereNotBetween
whereNotIn
whereNotInStrict
whereNotNull
whereNull
wrap
zip

方法列表

php all()
php all 方法返回由集合表示的底层数组:

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

php average()
php avg 方法的别名。

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

  1. $average = collect([
  2. ['foo' => 10],
  3. ['foo' => 10],
  4. ['foo' => 20],
  5. ['foo' => 40]
  6. ])->avg('foo');
  7. // 20
  8. $average = collect([1, 1, 2, 4])->avg();
  9. // 2

php chunk()
php chunk 方法将集合分成多个给定大小的较小集合:

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

当使用诸如 Bootstrap 之类的网格系统时,此方法在 views 中特别有用。例如,假设你有一组 Eloquent 模型要在网格中显示:

  1. @foreach ($products->chunk(3) as $chunk)
  2. <div class="row">
  3. @foreach ($chunk as $product)
  4. <div class="col-xs-4">{{ $product->name }}</div>
  5. @endforeach
  6. </div>
  7. @endforeach

php chunkWhile()
php chunkWhile 方法根据给定回调的评估将集合分成多个更小的集合。传递给闭包的 php $chunk 变量可用于检查前一个元素:

  1. $collection = collect(str_split('AABBCCCD'));
  2. $chunks = $collection->chunkWhile(function (string $value, int $key, Collection $chunk) {
  3. return $value === $chunk->last();
  4. });
  5. $chunks->all();
  6. // [['A', 'A'], ['B', 'B'], ['C', 'C', 'C'], ['D']]

php collapse()
php collapse 方法将数组集合折叠成一个单一的平面集合:

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

php collect()
php collect 方法返回一个新的 php Collection 实例,其中包含当前集合中的项目:

  1. $collectionA = collect([1, 2, 3]);
  2. $collectionB = $collectionA->collect();
  3. $collectionB->all();
  4. // [1, 2, 3]

php collect 方法主要用于将 惰性集合 转换为标准的 php Collection 实例:

  1. $lazyCollection = LazyCollection::make(function () {
  2. yield 1;
  3. yield 2;
  4. yield 3;
  5. });
  6. $collection = $lazyCollection->collect();
  7. get_class($collection);
  8. // 'Illuminate\Support\Collection'
  9. $collection->all();
  10. // [1, 2, 3]

技巧:当你有一个 php Enumerable 的实例并且需要一个非惰性集合实例时,php collect 方法特别有用。由于 php collect()php Enumerable 合约的一部分,你可以安全地使用它来获取 php Collection 实例。

php combine()
php combine 方法将集合的值作为键与另一个数组或集合的值组合:

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

php concat()
php concat 方法将给定的 php array 或集合的值附加到另一个集合的末尾:

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

php concat 方法在数字上重新索引连接到原始集合上的项目的键。要维护关联集合中的键,请参阅 merge 方法。

php contains()
php contains 方法确定集合是否包含给定项目。你可以将闭包传递给 php contains 方法,以确定集合中是否存在与给定真值测试匹配的元素:

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

或者,你可以将字符串传递给 php contains 方法,以确定集合是否包含给定的项目值:

  1. $collection = collect(['name' => 'Desk', 'price' => 100]);
  2. $collection->contains('Desk');
  3. // true
  4. $collection->contains('New York');
  5. // false

你还可以将键/值对传递给 php contains 方法,该方法将确定给定对是否存在于集合中:

  1. $collection = collect([
  2. ['product' => 'Desk', 'price' => 200],
  3. ['product' => 'Chair', 'price' => 100],
  4. ]);
  5. $collection->contains('product', 'Bookcase');
  6. // false

php contains 方法在检查项目值时使用“松散”比较,这意味着具有整数值的字符串将被视为等于具有相同值的整数。使用 php containsStrict 方法使用“严格”比较进行过滤。

对于 php contains 的逆操作,请参见 doesntContain 方法。

php containsOneItem()
php containsOneItem 方法决定了集合是否包含一个项目。

  1. collect([])->containsOneItem();
  2. // false
  3. collect(['1'])->containsOneItem();
  4. // true
  5. collect(['1', '2'])->containsOneItem();
  6. // false

php containsStrict()
此方法与 php contains 方法具有相同的签名;但是,所有值都使用「严格」比较进行比较。

技巧:使用 Eloquent Collections 时会修改此方法的行为。

php count()
php count 方法返回集合中的项目总数:

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

php countBy()
php countBy 方法计算集合中值的出现次数。默认情况下,该方法计算每个元素的出现次数,允许你计算集合中元素的某些“类型”:

  1. $collection = collect([1, 2, 2, 2, 3]);
  2. $counted = $collection->countBy();
  3. $counted->all();
  4. // [1 => 1, 2 => 3, 3 => 1]

你将闭包传递给 php countBy 方法以按自定义值计算所有项目:

  1. $collection = collect(['alice@gmail.com', 'bob@yahoo.com', 'carlos@gmail.com']);
  2. $counted = $collection->countBy(function (string $email) {
  3. return substr(strrchr($email, "@"), 1);
  4. });
  5. $counted->all();
  6. // ['gmail.com' => 2, 'yahoo.com' => 1]

php crossJoin()
php crossJoin 方法在给定的数组或集合中交叉连接集合的值,返回具有所有可能排列的笛卡尔积:

  1. $collection = collect([1, 2]);
  2. $matrix = $collection->crossJoin(['a', 'b']);
  3. $matrix->all();
  4. /*
  5. [
  6. [1, 'a'],
  7. [1, 'b'],
  8. [2, 'a'],
  9. [2, 'b'],
  10. ]
  11. */
  12. $collection = collect([1, 2]);
  13. $matrix = $collection->crossJoin(['a', 'b'], ['I', 'II']);
  14. $matrix->all();
  15. /*
  16. [
  17. [1, 'a', 'I'],
  18. [1, 'a', 'II'],
  19. [1, 'b', 'I'],
  20. [1, 'b', 'II'],
  21. [2, 'a', 'I'],
  22. [2, 'a', 'II'],
  23. [2, 'b', 'I'],
  24. [2, 'b', 'II'],
  25. ]
  26. */

php dd()
php dd 方法转储集合的项目并结束脚本的执行:

  1. $collection = collect(['John Doe', 'Jane Doe']);
  2. $collection->dd();
  3. /*
  4. Collection {
  5. #items: array:2 [
  6. 0 => "John Doe"
  7. 1 => "Jane Doe"
  8. ]
  9. }
  10. */

如果你不想停止执行脚本,请改用 php dump 方法。

php diff()
php diff 方法根据集合的值将集合与另一个集合或普通 PHP php array 进行比较。此方法将返回给定集合中不存在的原始集合中的值:

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

技巧:此方法的行为在使用 Eloquent Collections 时被修改。

php diffAssoc()
php diffAssoc 方法根据其键和值将集合与另一个集合或普通 PHP php array 进行比较。此方法将返回给定集合中不存在的原始集合中的键/值对:

  1. $collection = collect([
  2. 'color' => 'orange',
  3. 'type' => 'fruit',
  4. 'remain' => 6,
  5. ]);
  6. $diff = $collection->diffAssoc([
  7. 'color' => 'yellow',
  8. 'type' => 'fruit',
  9. 'remain' => 3,
  10. 'used' => 6,
  11. ]);
  12. $diff->all();
  13. // ['color' => 'orange', 'remain' => 6]

php diffKeys()
php diffKeys 方法将集合与另一个集合或基于其键的普通 PHP php array 进行比较。此方法将返回给定集合中不存在的原始集合中的键/值对:

  1. $collection = collect([
  2. 'one' => 10,
  3. 'two' => 20,
  4. 'three' => 30,
  5. 'four' => 40,
  6. 'five' => 50,
  7. ]);
  8. $diff = $collection->diffKeys([
  9. 'two' => 2,
  10. 'four' => 4,
  11. 'six' => 6,
  12. 'eight' => 8,
  13. ]);
  14. $diff->all();
  15. // ['one' => 10, 'three' => 30, 'five' => 50]

php doesntContain()
php doesntContain 方法确定集合是否不包含给定项目。你可以将闭包传递给 php doesntContain 方法,以确定集合中是否不存在与给定真值测试匹配的元素:

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

或者,你可以将字符串传递给 php doesntContain 方法,以确定集合是否不包含给定的项目值:

  1. $collection = collect(['name' => 'Desk', 'price' => 100]);
  2. $collection->doesntContain('Table');
  3. // true
  4. $collection->doesntContain('Desk');
  5. // false

你还可以将键/值对传递给 php doesntContain 方法,该方法将确定给定对是否不存在于集合中:

  1. $collection = collect([
  2. ['product' => 'Desk', 'price' => 200],
  3. ['product' => 'Chair', 'price' => 100],
  4. ]);
  5. $collection->doesntContain('product', 'Bookcase');
  6. // true

php doesntContain 方法在检查项目值时使用「松散」比较,这意味着具有整数值的字符串将被视为等于具有相同值的整数。

php dump()
php dump 方法转储集合的项目:

  1. $collection = collect(['John Doe', 'Jane Doe']);
  2. $collection->dump();
  3. /*
  4. Collection {
  5. #items: array:2 [
  6. 0 => "John Doe"
  7. 1 => "Jane Doe"
  8. ]
  9. }
  10. */

如果要在转储集合后停止执行脚本,请改用 php dd 方法。

php duplicates()
php duplicates 方法从集合中检索并返回重复值:

  1. $collection = collect(['a', 'b', 'a', 'c', 'b']);
  2. $collection->duplicates();
  3. // [2 => 'a', 4 => 'b']

如果集合包含数组或对象,你可以传递要检查重复值的属性的键:

  1. $employees = collect([
  2. ['email' => 'abigail@example.com', 'position' => 'Developer'],
  3. ['email' => 'james@example.com', 'position' => 'Designer'],
  4. ['email' => 'victoria@example.com', 'position' => 'Developer'],
  5. ]);
  6. $employees->duplicates('position');
  7. // [2 => 'Developer']

php duplicatesStrict()
此方法与 php duplicates 方法具有相同的签名;但是,所有值都使用「严格」比较进行比较。

php each()
php each 方法遍历集合中的项目并将每个项目传递给闭包:

  1. $collection = collect([1, 2, 3, 4]);
  2. $collection->each(function (int $item, int $key) {
  3. // ...
  4. });

如果你想停止遍历这些项目,你可以从你的闭包中返回 php false

  1. $collection->each(function (int $item, int $key) {
  2. if (/* condition */) {
  3. return false;
  4. }
  5. });

php eachSpread()
php eachSpread 方法迭代集合的项目,将每个嵌套项目值传递给给定的回调:

  1. $collection = collect([['John Doe', 35], ['Jane Doe', 33]]);
  2. $collection->eachSpread(function (string $name, int $age) {
  3. // ...
  4. });

你可以通过从回调中返回 php false 来停止遍历项目:

  1. $collection->eachSpread(function (string $name, int $age) {
  2. return false;
  3. });

php every()
php every 方法可用于验证集合的所有元素是否通过给定的真值测试:

  1. collect([1, 2, 3, 4])->every(function (int $value, int $key) {
  2. return $value > 2;
  3. });
  4. // false

如果集合为空,php every 方法将返回 true:

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

php except()
php except 方法返回集合中的所有项目,除了具有指定键的项目:

  1. $collection = collect(['product_id' => 1, 'price' => 100, 'discount' => false]);
  2. $filtered = $collection->except(['price', 'discount']);
  3. $filtered->all();
  4. // ['product_id' => 1]

对于 php except 的反义词,请参见 only 方法。

技巧:此方法的行为在使用 Eloquent Collections 时被修改。

php filter()
php filter 方法使用给定的回调过滤集合,只保留那些通过给定真值测试的项目:

  1. $collection = collect([1, 2, 3, 4]);
  2. $filtered = $collection->filter(function (int $value, int $key) {
  3. return $value > 2;
  4. });
  5. $filtered->all();
  6. // [3, 4]

如果没有提供回调,则集合中所有相当于 php false 的条目都将被删除:

  1. $collection = collect([1, 2, 3, null, false, '', 0, []]);
  2. $collection->filter()->all();
  3. // [1, 2, 3]

对于 php filter 的逆操作,请参见 reject 方法。

php first()
php first 方法返回集合中通过给定真值测试的第一个元素:

  1. collect([1, 2, 3, 4])->first(function (int $value, int $key) {
  2. return $value > 2;
  3. });
  4. // 3

你也可以调用不带参数的 php first 方法来获取集合中的第一个元素。如果集合为空,则返回 php null

  1. collect([1, 2, 3, 4])->first();
  2. // 1

php firstOrFail()
php firstOrFail 方法与 php first 方法相同;但是,如果没有找到结果,将抛出 php Illuminate/Support/ItemNotFoundException 异常。

  1. collect([1, 2, 3, 4])->firstOrFail(function (int $value, int $key) {
  2. return $value > 5;
  3. });
  4. // Throws ItemNotFoundException...

你也可以调用 php firstOrFail 方法,没有参数,以获得集合中的第一个元素。如果集合是空的,将抛出一个 php Illuminate\Support\ItemNotFoundException 异常。

  1. collect([])->firstOrFail();
  2. // Throws ItemNotFoundException...

php firstWhere()
php firstWhere 方法返回集合中具有给定键/值对的第一个元素:

  1. $collection = collect([
  2. ['name' => 'Regena', 'age' => null],
  3. ['name' => 'Linda', 'age' => 14],
  4. ['name' => 'Diego', 'age' => 23],
  5. ['name' => 'Linda', 'age' => 84],
  6. ]);
  7. $collection->firstWhere('name', 'Linda');
  8. // ['name' => 'Linda', 'age' => 14]

你还可以使用比较运算符调用 php firstWhere 方法:

  1. $collection->firstWhere('age', '>=', 18);
  2. // ['name' => 'Diego', 'age' => 23]

与 where 方法一样,你可以将一个参数传递给 php firstWhere 方法。在这种情况下,php firstWhere 方法将返回给定项目键值为「真」的第一个项目:

  1. $collection->firstWhere('age');
  2. // ['name' => 'Linda', 'age' => 14]

php flatMap()
php flatMap 方法遍历集合并将每个值传递给给定的闭包。闭包可以自由修改项目并将其返回,从而形成一个新的修改项目集合。然后,数组被展平一层:

  1. $collection = collect([
  2. ['name' => 'Sally'],
  3. ['school' => 'Arkansas'],
  4. ['age' => 28]
  5. ]);
  6. $flattened = $collection->flatMap(function (array $values) {
  7. return array_map('strtoupper', $values);
  8. });
  9. $flattened->all();
  10. // ['name' => 'SALLY', 'school' => 'ARKANSAS', 'age' => '28'];

php flatten()
php flatten 方法将多维集合展平为一维:

  1. $collection = collect([
  2. 'name' => 'taylor',
  3. 'languages' => [
  4. 'php', 'javascript'
  5. ]
  6. ]);
  7. $flattened = $collection->flatten();
  8. $flattened->all();
  9. // ['taylor', 'php', 'javascript'];

如有必要,你可以向 php flatten 方法传递一个「深度」参数:

  1. $collection = collect([
  2. 'Apple' => [
  3. [
  4. 'name' => 'iPhone 6S',
  5. 'brand' => 'Apple'
  6. ],
  7. ],
  8. 'Samsung' => [
  9. [
  10. 'name' => 'Galaxy S7',
  11. 'brand' => 'Samsung'
  12. ],
  13. ],
  14. ]);
  15. $products = $collection->flatten(1);
  16. $products->values()->all();
  17. /*
  18. [
  19. ['name' => 'iPhone 6S', 'brand' => 'Apple'],
  20. ['name' => 'Galaxy S7', 'brand' => 'Samsung'],
  21. ]
  22. */

在此示例中,调用 php flatten 而不提供深度也会使嵌套数组变平,从而导致 php ['iPhone 6S', 'Apple', 'Galaxy S7', 'Samsung']。提供深度允许你指定嵌套数组将被展平的级别数。

php flip()
php flip 方法将集合的键与其对应的值交换:

  1. $collection = collect(['name' => 'taylor', 'framework' => 'laravel']);
  2. $flipped = $collection->flip();
  3. $flipped->all();
  4. // ['taylor' => 'name', 'laravel' => 'framework']

php forget()
php forget 方法将通过指定的键来移除集合中对应的元素:

  1. $collection = collect(['name' => 'taylor', 'framework' => 'laravel']);
  2. $collection->forget('name');
  3. $collection->all();
  4. // ['framework' => 'laravel']

注意:与大多数集合的方法不同的是, php forget 不会返回修改后的新集合;它会直接修改原集合。

php forPage()
php forPage 方法返回一个含有指定页码数集合项的新集合。这个方法接受页码数作为其第一个参数,每页显示的项数作为其第二个参数:

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

php get()
php get 方法返回指定键的集合项,如果该键在集合中不存在,则返回 null:

  1. $collection = collect(['name' => 'taylor', 'framework' => 'laravel']);
  2. $value = $collection->get('name');
  3. // taylor

你可以任选一个默认值作为第二个参数传递:

  1. $collection = collect(['name' => 'taylor', 'framework' => 'laravel']);
  2. $value = $collection->get('age', 34);
  3. // 34

你甚至可以将一个回调函数作为默认值传递。如果指定的键不存在,就会返回回调函数的结果:

  1. $collection->get('email', function () {
  2. return 'taylor@example.com';
  3. });
  4. // taylor@example.com

php groupBy()
php groupBy 方法根据指定键对集合项进行分组:

  1. $collection = collect([
  2. ['account_id' => 'account-x10', 'product' => 'Chair'],
  3. ['account_id' => 'account-x10', 'product' => 'Bookcase'],
  4. ['account_id' => 'account-x11', 'product' => 'Desk'],
  5. ]);
  6. $grouped = $collection->groupBy('account_id');
  7. $grouped->all();
  8. /*
  9. [
  10. 'account-x10' => [
  11. ['account_id' => 'account-x10', 'product' => 'Chair'],
  12. ['account_id' => 'account-x10', 'product' => 'Bookcase'],
  13. ],
  14. 'account-x11' => [
  15. ['account_id' => 'account-x11', 'product' => 'Desk'],
  16. ],
  17. ]
  18. */

你可以传递回调,而不是传递字符串 php key。回调应返回你希望通过以下方式键入组的值:

  1. $grouped = $collection->groupBy(function (array $item, int $key) {
  2. return substr($item['account_id'], -3);
  3. });
  4. $grouped->all();
  5. /*
  6. [
  7. 'x10' => [
  8. ['account_id' => 'account-x10', 'product' => 'Chair'],
  9. ['account_id' => 'account-x10', 'product' => 'Bookcase'],
  10. ],
  11. 'x11' => [
  12. ['account_id' => 'account-x11', 'product' => 'Desk'],
  13. ],
  14. ]
  15. */

多个分组标准可以作为数组传递。每个数组元素将应用于多维数组中的相应级别:

  1. $data = new Collection([
  2. 10 => ['user' => 1, 'skill' => 1, 'roles' => ['Role_1', 'Role_3']],
  3. 20 => ['user' => 2, 'skill' => 1, 'roles' => ['Role_1', 'Role_2']],
  4. 30 => ['user' => 3, 'skill' => 2, 'roles' => ['Role_1']],
  5. 40 => ['user' => 4, 'skill' => 2, 'roles' => ['Role_2']],
  6. ]);
  7. $result = $data->groupBy(['skill', function (array $item) {
  8. return $item['roles'];
  9. }], preserveKeys: true);
  10. /*
  11. [
  12. 1 => [
  13. 'Role_1' => [
  14. 10 => ['user' => 1, 'skill' => 1, 'roles' => ['Role_1', 'Role_3']],
  15. 20 => ['user' => 2, 'skill' => 1, 'roles' => ['Role_1', 'Role_2']],
  16. ],
  17. 'Role_2' => [
  18. 20 => ['user' => 2, 'skill' => 1, 'roles' => ['Role_1', 'Role_2']],
  19. ],
  20. 'Role_3' => [
  21. 10 => ['user' => 1, 'skill' => 1, 'roles' => ['Role_1', 'Role_3']],
  22. ],
  23. ],
  24. 2 => [
  25. 'Role_1' => [
  26. 30 => ['user' => 3, 'skill' => 2, 'roles' => ['Role_1']],
  27. ],
  28. 'Role_2' => [
  29. 40 => ['user' => 4, 'skill' => 2, 'roles' => ['Role_2']],
  30. ],
  31. ],
  32. ];
  33. */

php has()
php has 方法确定集合中是否存在给定键:

  1. $collection = collect(['account_id' => 1, 'product' => 'Desk', 'amount' => 5]);
  2. $collection->has('product');
  3. // true
  4. $collection->has(['product', 'amount']);
  5. // true
  6. $collection->has(['amount', 'price']);
  7. // false

php hasAny()
php hasAny 方法确定在集合中是否存在任何给定的键。

  1. $collection = collect(['account_id' => 1, 'product' => 'Desk', 'amount' => 5]);
  2. $collection->hasAny(['product', 'price']);
  3. // true
  4. $collection->hasAny(['name', 'price']);
  5. // false

php implode()
php implode 方法连接集合中的项目。它的参数取决于集合中项目的类型。如果集合包含数组或对象,你应该传递你希望加入的属性的键,以及你希望放置在值之间的「胶水」字符串:

  1. $collection = collect([
  2. ['account_id' => 1, 'product' => 'Desk'],
  3. ['account_id' => 2, 'product' => 'Chair'],
  4. ]);
  5. $collection->implode('product', ', ');
  6. // Desk, Chair

如果集合包含简单的字符串或数值,则应将「胶水」作为唯一参数传递给该方法:

  1. collect([1, 2, 3, 4, 5])->implode('-');
  2. // '1-2-3-4-5'

如果你想对被内部处理的值进行格式化,你可以给 php implode 方法传递一个闭包。

  1. $collection->implode(function (array $item, int $key) {
  2. return strtoupper($item['product']);
  3. }, ', ');
  4. // DESK, CHAIR

php intersect()
php intersect 方法从原始集合中删除任何不存在于给定 php array 或集合中的值。生成的集合将保留原始集合的键:

  1. $collection = collect(['Desk', 'Sofa', 'Chair']);
  2. $intersect = $collection->intersect(['Desk', 'Chair', 'Bookcase']);
  3. $intersect->all();
  4. // [0 => 'Desk', 2 => 'Chair']

技巧:使用 Eloquent Collections 时会修改此方法的行为。

php intersectAssoc()
php intersectByKeys 方法从原始集合中删除给定 php array 或集合中不存在的任何键及其对应值:

  1. $collection = collect([
  2. 'color' => 'red',
  3. 'size' => 'M',
  4. 'material' => 'cotton'
  5. ]);
  6. $intersect = $collection->intersectAssoc([
  7. 'color' => 'blue',
  8. 'size' => 'M',
  9. 'material' => 'polyester'
  10. ]);
  11. $intersect->all();
  12. // ['size' => 'M']

php intersectByKeys()
php intersectByKeys 方法删除了原始集合中不存在于给定的数组或集合中的任何键和其相应的值。

  1. $collection = collect([
  2. 'serial' => 'UX301', 'type' => 'screen', 'year' => 2009,
  3. ]);
  4. $intersect = $collection->intersectByKeys([
  5. 'reference' => 'UX404', 'type' => 'tab', 'year' => 2011,
  6. ]);
  7. $intersect->all();
  8. // ['type' => 'screen', 'year' => 2009]

php isEmpty()
如果集合为空,php isEmpty 方法返回 php true;否则,返回 php false

  1. collect([])->isEmpty();
  2. // true

php isNotEmpty()
如果集合不为空,php isNotEmpty 方法返回 php true;否则,返回 php false

  1. collect([])->isNotEmpty();
  2. // false

php join()
php join 方法将集合的值与字符串连接起来。使用此方法的第二个参数,你还可以指定最终元素应如何附加到字符串:

  1. collect(['a', 'b', 'c'])->join(', '); // 'a, b, c'
  2. collect(['a', 'b', 'c'])->join(', ', ', and '); // 'a, b, and c'
  3. collect(['a', 'b'])->join(', ', ' and '); // 'a and b'
  4. collect(['a'])->join(', ', ' and '); // 'a'
  5. collect([])->join(', ', ' and '); // ''

php keyBy()
php keyBy 方法通过给定键对集合进行键控。如果多个项目具有相同的键,则只有最后一个会出现在新集合中:

  1. $collection = collect([
  2. ['product_id' => 'prod-100', 'name' => 'Desk'],
  3. ['product_id' => 'prod-200', 'name' => 'Chair'],
  4. ]);
  5. $keyed = $collection->keyBy('product_id');
  6. $keyed->all();
  7. /*
  8. [
  9. 'prod-100' => ['product_id' => 'prod-100', 'name' => 'Desk'],
  10. 'prod-200' => ['product_id' => 'prod-200', 'name' => 'Chair'],
  11. ]
  12. */

你也可以将回调传递给该方法。回调应通过以下方式返回值以作为集合的键:

  1. $keyed = $collection->keyBy(function (array $item, int $key) {
  2. return strtoupper($item['product_id']);
  3. });
  4. $keyed->all();
  5. /*
  6. [
  7. 'PROD-100' => ['product_id' => 'prod-100', 'name' => 'Desk'],
  8. 'PROD-200' => ['product_id' => 'prod-200', 'name' => 'Chair'],
  9. ]
  10. */

php keys()
php keys 方法返回集合的所有键:

  1. $collection = collect([
  2. 'prod-100' => ['product_id' => 'prod-100', 'name' => 'Desk'],
  3. 'prod-200' => ['product_id' => 'prod-200', 'name' => 'Chair'],
  4. ]);
  5. $keys = $collection->keys();
  6. $keys->all();
  7. // ['prod-100', 'prod-200']

php last()
php last 方法返回集合中通过给定真值测试的最后一个元素:

  1. collect([1, 2, 3, 4])->last(function (int $value, int $key) {
  2. return $value < 3;
  3. });
  4. // 2

你也可以调用不带参数的php last方法来获取集合中的最后一个元素。如果集合为空,则返回 php null

  1. collect([1, 2, 3, 4])->last();
  2. // 4

php lazy()
php lazy 方法从底层的项目数组中返回一个新的 php LazyCollection 实例。

  1. $lazyCollection = collect([1, 2, 3, 4])->lazy();
  2. get_class($lazyCollection);
  3. // Illuminate\Support\LazyCollection
  4. $lazyCollection->all();
  5. // [1, 2, 3, 4]

当你需要对一个包含许多项目的巨大 php Collection 进行转换时,这一点特别有用。

  1. $count = $hugeCollection
  2. ->lazy()
  3. ->where('country', 'FR')
  4. ->where('balance', '>', '100')
  5. ->count();

通过将集合转换为 php LazyCollection,我们避免了分配大量的额外内存。虽然原始集合仍然在内存中保留 它的 值,但后续的过滤器不会。因此,在过滤集合的结果时,几乎没有额外的内存被分配。

php macro()
静态php macro()方法允许你在运行时向「集合」类添加方法。有关详细信息,请参阅有关 扩展集合 的文档。

php make()
静态 php make 方法可以创建一个新的集合实例。请参照 创建集合 部分。

php map()
静态 php make 方法可以创建一个新的集合实例。请参照 创建集合 部分。

  1. $collection = collect([1, 2, 3, 4, 5]);
  2. $multiplied = $collection->map(function (int $item, int $key) {
  3. return $item * 2;
  4. });
  5. $multiplied->all();
  6. // [2, 4, 6, 8, 10]

注意:与其他大多数集合方法一样, php map 会返回一个新的集合实例;它不会修改原集合。如果你想修改原集合,请使用 php transform 方法。

php mapInto()
php mapInto() 方法可以迭代集合,通过将值传递给构造函数来创建给定类的新实例:

  1. class Currency
  2. {
  3. /**
  4. * create a new currency instance.
  5. */
  6. function __construct(
  7. public string $code
  8. ) {}
  9. }
  10. $collection = collect(['USD', 'EUR', 'GBP']);
  11. $currencies = $collection->mapInto(Currency::class);
  12. $currencies->all();
  13. // [Currency('USD'), Currency('EUR'), Currency('GBP')]

php mapSpread()
php mapSpread 方法可以迭代集合,将每个嵌套项值给指定的回调函数。该回调函数可以自由修改该集合项并返回,从而生成被修改过集合项的新集合:

  1. $collection = collect([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
  2. $chunks = $collection->chunk(2);
  3. $sequence = $chunks->mapSpread(function (int $even, int $odd) {
  4. return $even + $odd;
  5. });
  6. $sequence->all();
  7. // [1, 5, 9, 13, 17]

php mapToGroups()
php mapToGroups 方法通过给定的回调函数对集合项进行分组。该回调函数应该返回一个包含单个键 / 值对的关联数组,从而生成一个分组值的新集合:

  1. $collection = collect([
  2. [
  3. 'name' => 'John Doe',
  4. 'department' => 'Sales',
  5. ],
  6. [
  7. 'name' => 'Jane Doe',
  8. 'department' => 'Sales',
  9. ],
  10. [
  11. 'name' => 'Johnny Doe',
  12. 'department' => 'Marketing',
  13. ]
  14. ]);
  15. $grouped = $collection->mapToGroups(function (array $item, int $key) {
  16. return [$item['department'] => $item['name']];
  17. });
  18. $grouped->all();
  19. /*
  20. [
  21. 'Sales' => ['John Doe', 'Jane Doe'],
  22. 'Marketing' => ['Johnny Doe'],
  23. ]
  24. */
  25. $grouped->get('Sales')->all();
  26. // ['John Doe', 'Jane Doe']

php mapWithKeys()
php mapWithKeys 方法遍历集合并将每个值传递给给定的回调。回调应返回包含单个键/值对的关联数组:

  1. $collection = collect([
  2. [
  3. 'name' => 'John',
  4. 'department' => 'Sales',
  5. 'email' => 'john@example.com',
  6. ],
  7. [
  8. 'name' => 'Jane',
  9. 'department' => 'Marketing',
  10. 'email' => 'jane@example.com',
  11. ]
  12. ]);
  13. $keyed = $collection->mapWithKeys(function (array $item, int $key) {
  14. return [$item['email'] => $item['name']];
  15. });
  16. $keyed->all();
  17. /*
  18. [
  19. 'john@example.com' => 'John',
  20. 'jane@example.com' => 'Jane',
  21. ]
  22. */

php max()
php max 方法返回给定键的最大值:

  1. $max = collect([
  2. ['foo' => 10],
  3. ['foo' => 20]
  4. ])->max('foo');
  5. // 20
  6. $max = collect([1, 2, 3, 4, 5])->max();
  7. // 5

php median()
php median 方法返回给定键的 中值

  1. $median = collect([
  2. ['foo' => 10],
  3. ['foo' => 10],
  4. ['foo' => 20],
  5. ['foo' => 40]
  6. ])->median('foo');
  7. // 15
  8. $median = collect([1, 1, 2, 4])->median();
  9. // 1.5

php merge()
php merge 方法将给定的数组或集合与原始集合合并。如果给定项目中的字符串键与原始集合中的字符串键匹配,则给定项目的值将覆盖原始集合中的值:

  1. $collection = collect(['product_id' => 1, 'price' => 100]);
  2. $merged = $collection->merge(['price' => 200, 'discount' => false]);
  3. $merged->all();
  4. // ['product_id' => 1, 'price' => 200, 'discount' => false]

如果给定项目的键是数字,则值将附加到集合的末尾:

  1. $collection = collect(['Desk', 'Chair']);
  2. $merged = $collection->merge(['Bookcase', 'Door']);
  3. $merged->all();
  4. // ['Desk', 'Chair', 'Bookcase', 'Door']

php mergeRecursive()
php mergeRecursive 方法将给定的数组或集合递归地与原始集合合并。如果给定项目中的字符串键与原始集合中的字符串键匹配,则这些键的值将合并到一个数组中,这是递归完成的:

  1. $collection = collect(['product_id' => 1, 'price' => 100]);
  2. $merged = $collection->mergeRecursive([
  3. 'product_id' => 2,
  4. 'price' => 200,
  5. 'discount' => false
  6. ]);
  7. $merged->all();
  8. // ['product_id' => [1, 2], 'price' => [100, 200], 'discount' => false]

php min()
php min 方法返回给定键的最小值:

  1. $min = collect([['foo' => 10], ['foo' => 20]])->min('foo');
  2. // 10
  3. $min = collect([1, 2, 3, 4, 5])->min();
  4. // 1

php mode()
php mode 方法返回给定键的 mode 值 “mode 值”):

  1. $mode = collect([
  2. ['foo' => 10],
  3. ['foo' => 10],
  4. ['foo' => 20],
  5. ['foo' => 40]
  6. ])->mode('foo');
  7. // [10]
  8. $mode = collect([1, 1, 2, 4])->mode();
  9. // [1]
  10. $mode = collect([1, 1, 2, 2])->mode();
  11. // [1, 2]

php nth()
php nth 方法创建一个由每个第 n 个元素组成的新集合:

  1. $collection = collect(['a', 'b', 'c', 'd', 'e', 'f']);
  2. $collection->nth(4);
  3. // ['a', 'e']

你可以选择将起始偏移量作为第二个参数传递:

  1. $collection->nth(4, 1);
  2. // ['b', 'f']

php only()
php only 方法返回集合中具有指定键的项目:

  1. $collection = collect([
  2. 'product_id' => 1,
  3. 'name' => 'Desk',
  4. 'price' => 100,
  5. 'discount' => false
  6. ]);
  7. $filtered = $collection->only(['product_id', 'name']);
  8. $filtered->all();
  9. // ['product_id' => 1, 'name' => 'Desk']

关于 php only 的反义词,见except 方法。

技巧:使用 Eloquent Collections 时会修改此方法的行为。

php pad()
php pad 方法将用给定的值填充数组,直到数组达到指定的大小。此方法的行为类似于 array_pad PHP 函数。

要向左填充,你应该指定一个负尺寸。如果给定大小的绝对值小于或等于数组的长度,则不会发生填充:

  1. $collection = collect(['A', 'B', 'C']);
  2. $filtered = $collection->pad(5, 0);
  3. $filtered->all();
  4. // ['A', 'B', 'C', 0, 0]
  5. $filtered = $collection->pad(-5, 0);
  6. $filtered->all();
  7. // [0, 0, 'A', 'B', 'C']

php partition()
php partition 方法可以与 PHP 数组解构相结合,以将通过给定真值测试的元素与未通过的元素分开:

  1. $collection = collect([1, 2, 3, 4, 5, 6]);
  2. [$underThree, $equalOrAboveThree] = $collection->partition(function (int $i) {
  3. return $i < 3;
  4. });
  5. $underThree->all();
  6. // [1, 2]
  7. $equalOrAboveThree->all();
  8. // [3, 4, 5, 6]

php pipe()
php pipe 可以把集合放到回调参数中并返回回调的结果:

  1. $collection = collect([1, 2, 3]);
  2. $piped = $collection->pipe(function (Collection $collection) {
  3. return $collection->sum();
  4. });
  5. // 6

php pipeInto()
php pipeInto 方法创建一个给定类的新实例,并将集合传递给构造函数:

  1. class ResourceCollection
  2. {
  3. /**
  4. * create a new ResourceCollection instance.
  5. */
  6. public function __construct(
  7. public Collection $collection,
  8. ) {}
  9. }
  10. $collection = collect([1, 2, 3]);
  11. $resource = $collection->pipeInto(ResourceCollection::class);
  12. $resource->collection->all();
  13. // [1, 2, 3]

php pipeThrough()
php pipeThrough 方法将集合传递给给定的闭包数组并返回执行的闭包的结果:

  1. use Illuminate\Support\Collection;
  2. $collection = collect([1, 2, 3]);
  3. $result = $collection->pipeThrough([
  4. function (Collection $collection) {
  5. return $collection->merge([4, 5]);
  6. },
  7. function (Collection $collection) {
  8. return $collection->sum();
  9. },
  10. ]);
  11. // 15

php pluck()
php pluck 可以获取集合中指定键对应的所有值:

  1. $collection = collect([
  2. ['product_id' => 'prod-100', 'name' => 'Desk'],
  3. ['product_id' => 'prod-200', 'name' => 'Chair'],
  4. ]);
  5. $plucked = $collection->pluck('name');
  6. $plucked->all();
  7. // ['Desk', 'Chair']

你也可以通过传入第二个参数来指定生成集合的 key(键):

  1. $plucked = $collection->pluck('name', 'product_id');
  2. $plucked->all();
  3. // ['prod-100' => 'Desk', 'prod-200' => 'Chair']

php pluck 也支持利用「.」标记的方法取出多维数组的键值:

  1. $collection = collect([
  2. [
  3. 'name' => 'Laracon',
  4. 'speakers' => [
  5. 'first_day' => ['Rosa', 'Judith'],
  6. ],
  7. ],
  8. [
  9. 'name' => 'VueConf',
  10. 'speakers' => [
  11. 'first_day' => ['Abigail', 'Joey'],
  12. ],
  13. ],
  14. ]);
  15. $plucked = $collection->pluck('speakers.first_day');
  16. $plucked->all();
  17. // [['Rosa', 'Judith'], ['Abigail', 'Joey']]

如果存在重复键,则将最后一个匹配元素插入到 plucked 集合中:

  1. $collection = collect([
  2. ['brand' => 'Tesla', 'color' => 'red'],
  3. ['brand' => 'Pagani', 'color' => 'white'],
  4. ['brand' => 'Tesla', 'color' => 'black'],
  5. ['brand' => 'Pagani', 'color' => 'orange'],
  6. ]);
  7. $plucked = $collection->pluck('color', 'brand');
  8. $plucked->all();
  9. // ['Tesla' => 'black', 'Pagani' => 'orange']

php pop()
php pop 方法删除并返回集合中的最后一项:

  1. $collection = collect([1, 2, 3, 4, 5]);
  2. $collection->pop();
  3. // 5
  4. $collection->all();
  5. // [1, 2, 3, 4]

你可以将整数传递给 php pop 方法以从集合末尾删除并返回多个项目:

  1. $collection = collect([1, 2, 3, 4, 5]);
  2. $collection->pop(3);
  3. // collect([5, 4, 3])
  4. $collection->all();
  5. // [1, 2]

php prepend()
php prepend 方法将一个项目添加到集合的开头:

  1. $collection = collect([1, 2, 3, 4, 5]);
  2. $collection->prepend(0);
  3. $collection->all();
  4. // [0, 1, 2, 3, 4, 5]

你还可以传递第二个参数来指定前置项的键:

  1. $collection = collect(['one' => 1, 'two' => 2]);
  2. $collection->prepend(0, 'zero');
  3. $collection->all();
  4. // ['zero' => 0, 'one' => 1, 'two' => 2]

php pull()
php pull 方法通过它的键从集合中移除并返回一个项目:

  1. $collection = collect(['product_id' => 'prod-100', 'name' => 'Desk']);
  2. $collection->pull('name');
  3. // 'Desk'
  4. $collection->all();
  5. // ['product_id' => 'prod-100']

php push()
php push 方法将一个项目附加到集合的末尾:

  1. $collection = collect([1, 2, 3, 4]);
  2. $collection->push(5);
  3. $collection->all();
  4. // [1, 2, 3, 4, 5]

php put()
php put 方法在集合中设置给定的键和值:

  1. $collection = collect(['product_id' => 1, 'name' => 'Desk']);
  2. $collection->put('price', 100);
  3. $collection->all();
  4. // ['product_id' => 1, 'name' => 'Desk', 'price' => 100]

php random()
php random 方法从集合中返回一个随机项:

  1. $collection = collect([1, 2, 3, 4, 5]);
  2. $collection->random();
  3. // 4 - (retrieved randomly)

你可以将一个整数传递给 php random,以指定要随机检索的项目数。当明确传递你希望接收的项目数时,始终返回项目集合:

  1. $random = $collection->random(3);
  2. $random->all();
  3. // [2, 4, 5] - (retrieved randomly)

如果集合实例的项目少于请求的项目,则 php random 方法将抛出 php InvalidArgumentException

php random 方法也接受一个闭包,它将接收当前集合实例。

  1. use Illuminate\Support\Collection;
  2. $random = $collection->random(fn (Collection $items) => min(10, count($items)));
  3. $random->all();
  4. // [1, 2, 3, 4, 5] - (retrieved randomly)

php range()
php range 方法返回一个包含指定范围之间整数的集合:

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

php reduce()
php reduce 方法将集合减少为单个值,将每次迭代的结果传递给后续迭代:

  1. $collection = collect([1, 2, 3]);
  2. $total = $collection->reduce(function (int $carry, int $item) {
  3. return $carry + $item;
  4. });
  5. // 6

php $carry 在第一次迭代时的值为 php null;但是,你可以通过将第二个参数传递给 php reduce 来指定其初始值:

  1. $collection->reduce(function (int $carry, int $item) {
  2. return $carry + $item;
  3. }, 4);
  4. // 10

php reduce 方法还将关联集合中的数组键传递给给定的回调:

  1. $collection = collect([
  2. 'usd' => 1400,
  3. 'gbp' => 1200,
  4. 'eur' => 1000,
  5. ]);
  6. $ratio = [
  7. 'usd' => 1,
  8. 'gbp' => 1.37,
  9. 'eur' => 1.22,
  10. ];
  11. $collection->reduce(function (int $carry, int $value, int $key) use ($ratio) {
  12. return $carry + ($value * $ratio[$key]);
  13. });
  14. // 4264

php reduceSpread()
php reduceSpread 方法将集合缩减为一个值数组,将每次迭代的结果传递给后续迭代。此方法类似于 php reduce 方法;但是,它可以接受多个初始值:

  1. [$creditsRemaining, $batch] = Image::where('status', 'unprocessed')
  2. ->get()
  3. ->reduceSpread(function (int $creditsRemaining, Collection $batch, Image $image) {
  4. if ($creditsRemaining >= $image->creditsRequired()) {
  5. $batch->push($image);
  6. $creditsRemaining -= $image->creditsRequired();
  7. }
  8. return [$creditsRemaining, $batch];
  9. }, $creditsAvailable, collect());

php reject()
php reject 方法使用给定的闭包过滤集合。如果应从结果集合中删除项目,则闭包应返回 php true

  1. $collection = collect([1, 2, 3, 4]);
  2. $filtered = $collection->reject(function (int $value, int $key) {
  3. return $value > 2;
  4. });
  5. $filtered->all();
  6. // [1, 2]

对于 php reject 方法的逆操作,请参见 php filter 方法。

php replace()

  1. $collection = collect(['Taylor', 'Abigail', 'James']);
  2. $replaced = $collection->replace([1 => 'Victoria', 3 => 'Finn']);
  3. $replaced->all();
  4. // ['Taylor', 'Victoria', 'James', 'Finn']

php replaceRecursive()
此方法的工作方式类似于 php replace,但它会重复出现在数组中并对内部值应用相同的替换过程:

  1. $collection = collect([
  2. 'Taylor',
  3. 'Abigail',
  4. [
  5. 'James',
  6. 'Victoria',
  7. 'Finn'
  8. ]
  9. ]);
  10. $replaced = $collection->replaceRecursive([
  11. 'Charlie',
  12. 2 => [1 => 'King']
  13. ]);
  14. $replaced->all();
  15. // ['Charlie', 'Abigail', ['James', 'King', 'Finn']]

php reverse()
php reverse 方法反转集合项的顺序,保留原始键:

  1. $collection = collect(['a', 'b', 'c', 'd', 'e']);
  2. $reversed = $collection->reverse();
  3. $reversed->all();
  4. /*
  5. [
  6. 4 => 'e',
  7. 3 => 'd',
  8. 2 => 'c',
  9. 1 => 'b',
  10. 0 => 'a',
  11. ]
  12. */

php search()
php search 方法在集合中搜索给定值,如果找到则返回其键。如果未找到该项目,则返回 php false

  1. $collection = collect([2, 4, 6, 8]);
  2. $collection->search(4);
  3. // 1

搜索是使用「松散」比较完成的,这意味着具有整数值的字符串将被视为等于具有相同值的整数。要使用「严格」比较,请将 php true 作为第二个参数传递给方法:

  1. collect([2, 4, 6, 8])->search('4', $strict = true);
  2. // false

或者,你可以提供自己的闭包来搜索通过给定真值测试的第一个项目:

  1. collect([2, 4, 6, 8])->search(function (int $item, int $key) {
  2. return $item > 5;
  3. });
  4. // 2

php shift()
php shift 方法从集合中移除并返回第一项:

  1. $collection = collect([1, 2, 3, 4, 5]);
  2. $collection->shift();
  3. // 1
  4. $collection->all();
  5. // [2, 3, 4, 5]

你可以将整数传递给 php shift 方法以从集合的开头删除并返回多个项目:

  1. $collection = collect([1, 2, 3, 4, 5]);
  2. $collection->shift(3);
  3. // collect([1, 2, 3])
  4. $collection->all();
  5. // [4, 5]

php shuffle()
php shuffle 方法随机打乱集合中的项目:

  1. $collection = collect([1, 2, 3, 4, 5]);
  2. $shuffled = $collection->shuffle();
  3. $shuffled->all();
  4. // [3, 2, 5, 1, 4] - (generated randomly)

php skip()
php skip 方法返回一个新的集合,并从集合的开始删除指定数量的元素。

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

php skipUntil()
php skipUntil 方法跳过集合中的项目,直到给定的回调返回 php true,然后将集合中的剩余项目作为新的集合实例返回:

  1. $collection = collect([1, 2, 3, 4]);
  2. $subset = $collection->skipUntil(function (int $item) {
  3. return $item >= 3;
  4. });
  5. $subset->all();
  6. // [3, 4]

你还可以将一个简单的值传递给 php skipUntil 方法以跳过所有项目,直到找到给定值:

  1. $collection = collect([1, 2, 3, 4]);
  2. $subset = $collection->skipUntil(3);
  3. $subset->all();
  4. // [3, 4]

注意:如果没有找到给定的值或者回调从未返回 php truephp skipUntil 方法将返回一个空集合。

php skipWhile()
php skipWhile 方法在给定回调返回 php true 时跳过集合中的项目,然后将集合中的剩余项目作为新集合返回:

  1. $collection = collect([1, 2, 3, 4]);
  2. $subset = $collection->skipWhile(function (int $item) {
  3. return $item <= 3;
  4. });
  5. $subset->all();
  6. // [4]

注意:如果回调从未返回 php falsephp skipWhile 方法将返回一个空集合。

php slice()
php slice 方法返回从给定索引开始的集合的一个片断。

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

如果你想限制返回切片的大小,请将所需的大小作为第二个参数传给该方法。

  1. $slice = $collection->slice(4, 2);
  2. $slice->all();
  3. // [5, 6]

返回的切片将默认保留键值。如果你不希望保留原始键,你可以使用 php values 方法来重新索引它们。

php sliding()
php sliding 方法返回一个新的块集合,表示集合中项目的「滑动窗口」视图:

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

这与 php eachSpread 方法结合使用特别有用:

  1. $transactions->sliding(2)->eachSpread(function (Collection $previous, Collection $current) {
  2. $current->total = $previous->total + $current->amount;
  3. });

你可以选择传递第二个「步长」值,该值确定每个块的第一项之间的距离:

  1. $collection = collect([1, 2, 3, 4, 5]);
  2. $chunks = $collection->sliding(3, step: 2);
  3. $chunks->toArray();
  4. // [[1, 2, 3], [3, 4, 5]]

php sole()
php sole 方法返回集合中第一个通过给定真值测试的元素,但只有在真值测试正好匹配一个元素的情况下。

  1. collect([1, 2, 3, 4])->sole(function (int $value, int $key) {
  2. return $value === 2;
  3. });
  4. // 2

你也可以向 php sole 方法传递一个键/值对,它将返回集合中第一个与给定对相匹配的元素,但只有当它正好有一个元素相匹配时。

  1. $collection = collect([
  2. ['product' => 'Desk', 'price' => 200],
  3. ['product' => 'Chair', 'price' => 100],
  4. ]);
  5. $collection->sole('product', 'Chair');
  6. // ['product' => 'Chair', 'price' => 100]

另外,如果只有一个元素,你也可以调用没有参数的 php sole 方法来获得集合中的第一个元素。

  1. $collection = collect([
  2. ['product' => 'Desk', 'price' => 200],
  3. ]);
  4. $collection->sole();
  5. // ['product' => 'Desk', 'price' => 200]

如果集合中没有应该由 php sole 方法返回的元素,则会抛出 php \Illuminate\Collections\ItemNotFoundException 异常。如果应该返回多个元素,则会抛出 php \Illuminate\Collections\MultipleItemsFoundException

php some()
php contains 方法的别名。

php sort()
php sort 方法对集合进行排序。排序后的集合保留了原始数组键,因此在下面的示例中,我们将使用 php values 方法将键重置为连续编号的索引:

  1. $collection = collect([5, 3, 1, 2, 4]);
  2. $sorted = $collection->sort();
  3. $sorted->values()->all();
  4. // [1, 2, 3, 4, 5]

如果你的排序需求更高级,你可以使用自己的算法将回调传递给「排序」。参考 PHP 文档 php uasort,就是集合的php sort方法 调用内部使用。

技巧:如果你需要对嵌套数组或对象的集合进行排序,请参阅 php sortByphp sortByDesc 方法。

php sortBy()
php sortBy 方法按给定键对集合进行排序。排序后的集合保留了原始数组键,因此在下面的示例中,我们将使用 php values 方法将键重置为连续编号的索引:

  1. $collection = collect([
  2. ['name' => 'Desk', 'price' => 200],
  3. ['name' => 'Chair', 'price' => 100],
  4. ['name' => 'Bookcase', 'price' => 150],
  5. ]);
  6. $sorted = $collection->sortBy('price');
  7. $sorted->values()->all();
  8. /*
  9. [
  10. ['name' => 'Chair', 'price' => 100],
  11. ['name' => 'Bookcase', 'price' => 150],
  12. ['name' => 'Desk', 'price' => 200],
  13. ]
  14. */

php sortBy 方法接受 sort flags 作为其第二个参数:

  1. $collection = collect([
  2. ['title' => 'Item 1'],
  3. ['title' => 'Item 12'],
  4. ['title' => 'Item 3'],
  5. ]);
  6. $sorted = $collection->sortBy('title', SORT_NATURAL);
  7. $sorted->values()->all();
  8. /*
  9. [
  10. ['title' => 'Item 1'],
  11. ['title' => 'Item 3'],
  12. ['title' => 'Item 12'],
  13. ]
  14. */

或者,你可以传递自己的闭包来确定如何对集合的值进行排序:

  1. $collection = collect([
  2. ['name' => 'Desk', 'colors' => ['Black', 'Mahogany']],
  3. ['name' => 'Chair', 'colors' => ['Black']],
  4. ['name' => 'Bookcase', 'colors' => ['Red', 'Beige', 'Brown']],
  5. ]);
  6. $sorted = $collection->sortBy(function (array $product, int $key) {
  7. return count($product['colors']);
  8. });
  9. $sorted->values()->all();
  10. /*
  11. [
  12. ['name' => 'Chair', 'colors' => ['Black']],
  13. ['name' => 'Desk', 'colors' => ['Black', 'Mahogany']],
  14. ['name' => 'Bookcase', 'colors' => ['Red', 'Beige', 'Brown']],
  15. ]
  16. */

如果你想按多个属性对集合进行排序,可以将排序操作数组传递给 php sortBy 方法。每个排序操作都应该是一个数组,由你希望排序的属性和所需排序的方向组成:

  1. $collection = collect([
  2. ['name' => 'Taylor Otwell', 'age' => 34],
  3. ['name' => 'Abigail Otwell', 'age' => 30],
  4. ['name' => 'Taylor Otwell', 'age' => 36],
  5. ['name' => 'Abigail Otwell', 'age' => 32],
  6. ]);
  7. $sorted = $collection->sortBy([
  8. ['name', 'asc'],
  9. ['age', 'desc'],
  10. ]);
  11. $sorted->values()->all();
  12. /*
  13. [
  14. ['name' => 'Abigail Otwell', 'age' => 32],
  15. ['name' => 'Abigail Otwell', 'age' => 30],
  16. ['name' => 'Taylor Otwell', 'age' => 36],
  17. ['name' => 'Taylor Otwell', 'age' => 34],
  18. ]
  19. */

当按多个属性对集合进行排序时,你还可以提供定义每个排序操作的闭包:

  1. $collection = collect([
  2. ['name' => 'Taylor Otwell', 'age' => 34],
  3. ['name' => 'Abigail Otwell', 'age' => 30],
  4. ['name' => 'Taylor Otwell', 'age' => 36],
  5. ['name' => 'Abigail Otwell', 'age' => 32],
  6. ]);
  7. $sorted = $collection->sortBy([
  8. fn (array $a, array $b) => $a['name'] <=> $b['name'],
  9. fn (array $a, array $b) => $b['age'] <=> $a['age'],
  10. ]);
  11. $sorted->values()->all();
  12. /*
  13. [
  14. ['name' => 'Abigail Otwell', 'age' => 32],
  15. ['name' => 'Abigail Otwell', 'age' => 30],
  16. ['name' => 'Taylor Otwell', 'age' => 36],
  17. ['name' => 'Taylor Otwell', 'age' => 34],
  18. ]
  19. */

php sortByDesc()
此方法与 php sortBy 方法具有相同的签名,但将以相反的顺序对集合进行排序。

php sortDesc()
此方法将按照与 php sort 方法相反的顺序对集合进行排序:

  1. $collection = collect([5, 3, 1, 2, 4]);
  2. $sorted = $collection->sortDesc();
  3. $sorted->values()->all();
  4. // [5, 4, 3, 2, 1]

php sort 不同,你不能将闭包传递给 php sortDesc。相反,你应该使用 php sort 方法并反转比较。

php sortKeys()
php sortKeys 方法通过底层关联数组的键对集合进行排序:

  1. $collection = collect([
  2. 'id' => 22345,
  3. 'first' => 'John',
  4. 'last' => 'Doe',
  5. ]);
  6. $sorted = $collection->sortKeys();
  7. $sorted->all();
  8. /*
  9. [
  10. 'first' => 'John',
  11. 'id' => 22345,
  12. 'last' => 'Doe',
  13. ]
  14. */

php sortKeysDesc()
此方法与 php sortKeys 方法具有相同的签名,但将以相反的顺序对集合进行排序。

php sortKeysUsing()
php sortKeysUsing 方法使用回调通过底层关联数组的键对集合进行排序:

  1. $collection = collect([
  2. 'ID' => 22345,
  3. 'first' => 'John',
  4. 'last' => 'Doe',
  5. ]);
  6. $sorted = $collection->sortKeysUsing('strnatcasecmp');
  7. $sorted->all();
  8. /*
  9. [
  10. 'first' => 'John',
  11. 'ID' => 22345,
  12. 'last' => 'Doe',
  13. ]
  14. */

回调必须是返回小于、等于或大于零的整数的比较函数。有关更多信息,请参阅 php uksort 上的 PHP 文档,这是 PHP 函数 php sortKeysUsing 方法在内部使用。

php splice()
php splice 方法删除并返回从指定索引开始的项目切片:

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

你可以传递第二个参数来限制结果集合的大小:

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

此外,你可以传递包含新项目的第三个参数来替换从集合中删除的项目:

  1. $collection = collect([1, 2, 3, 4, 5]);
  2. $chunk = $collection->splice(2, 1, [10, 11]);
  3. $chunk->all();
  4. // [3]
  5. $collection->all();
  6. // [1, 2, 10, 11, 4, 5]

php split()
php split 方法将集合分成给定数量的组:

  1. $collection = collect([1, 2, 3, 4, 5]);
  2. $groups = $collection->split(3);
  3. $groups->all();
  4. // [[1, 2], [3, 4], [5]]

php splitIn()
php splitIn 方法将集合分成给定数量的组,在将剩余部分分配给最终组之前完全填充非终端组:

  1. $collection = collect([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
  2. $groups = $collection->splitIn(3);
  3. $groups->all();
  4. // [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10]]

php sum()
php sum 方法返回集合中所有项目的总和:

  1. collect([1, 2, 3, 4, 5])->sum();
  2. // 15

如果集合包含嵌套数组或对象,则应传递一个键,用于确定要对哪些值求和:

  1. $collection = collect([
  2. ['name' => 'JavaScript: The Good Parts', 'pages' => 176],
  3. ['name' => 'JavaScript: The Definitive Guide', 'pages' => 1096],
  4. ]);
  5. $collection->sum('pages');
  6. // 1272

此外,你可以传递自己的闭包来确定要对集合的哪些值求和:

  1. $collection = collect([
  2. ['name' => 'Chair', 'colors' => ['Black']],
  3. ['name' => 'Desk', 'colors' => ['Black', 'Mahogany']],
  4. ['name' => 'Bookcase', 'colors' => ['Red', 'Beige', 'Brown']],
  5. ]);
  6. $collection->sum(function (array $product) {
  7. return count($product['colors']);
  8. });
  9. // 6

php take()
php take 方法返回一个具有指定数量项目的新集合:

  1. $collection = collect([0, 1, 2, 3, 4, 5]);
  2. $chunk = $collection->take(3);
  3. $chunk->all();
  4. // [0, 1, 2]

你还可以传递一个负整数以从集合末尾获取指定数量的项目:

  1. $collection = collect([0, 1, 2, 3, 4, 5]);
  2. $chunk = $collection->take(-2);
  3. $chunk->all();
  4. // [4, 5]

php takeUntil()
php takeUntil 方法返回集合中的项目,直到给定的回调返回 php true

  1. $collection = collect([1, 2, 3, 4]);
  2. $subset = $collection->takeUntil(function (int $item) {
  3. return $item >= 3;
  4. });
  5. $subset->all();
  6. // [1, 2]

你还可以将一个简单的值传递给 php takeUntil 方法以获取项目,直到找到给定值:

  1. $collection = collect([1, 2, 3, 4]);
  2. $subset = $collection->takeUntil(3);
  3. $subset->all();
  4. // [1, 2]

注意:如果未找到给定值或回调从未返回 php true,则 php takeUntil 方法将返回集合中的所有项目。

php takeWhile()
php takeWhile 方法返回集合中的项目,直到给定的回调返回 php false

  1. $collection = collect([1, 2, 3, 4]);
  2. $subset = $collection->takeWhile(function (int $item) {
  3. return $item < 3;
  4. });
  5. $subset->all();
  6. // [1, 2]

注意:如果回调从不返回 php false,则 php takeWhile 方法将返回集合中的所有项目。

php tap()
php tap 方法将集合传递给给定的回调,允许你在特定点「点击」到集合中并在不影响集合本身的情况下对项目执行某些操作。然后集合由 php tap 方法返回:

  1. collect([2, 4, 3, 1, 5])
  2. ->sort()
  3. ->tap(function (Collection $collection) {
  4. Log::debug('Values after sorting', $collection->values()->all());
  5. })
  6. ->shift();
  7. // 1

php times()
静态 php times 方法通过调用给定次数的回调函数来创建新集合:

  1. $collection = Collection::times(10, function (int $number) {
  2. return $number * 9;
  3. });
  4. $collection->all();
  5. // [9, 18, 27, 36, 45, 54, 63, 72, 81, 90]

php toArray()
php toArray 方法将集合转换成 PHP php array。如果集合的值是 Eloquent 模型,那也会被转换成数组:

  1. $collection = collect(['name' => 'Desk', 'price' => 200]);
  2. $collection->toArray();
  3. /*
  4. [
  5. ['name' => 'Desk', 'price' => 200],
  6. ]
  7. */

注意:php toArray 也会将 php Arrayable 的实例、所有集合的嵌套对象转换为数组。如果你想获取原数组,可以使用 php all 方法。

php toJson()
php toJson 方法将集合转换成 JSON 字符串:

  1. $collection = collect(['name' => 'Desk', 'price' => 200]);
  2. $collection->toJson();
  3. // '{"name":"Desk", "price":200}'

php transform()
php transform 方法会遍历整个集合,并对集合中的每个元素都会调用其回调函数。集合中的元素将被替换为回调函数返回的值:

  1. $collection = collect([1, 2, 3, 4, 5]);
  2. $collection->transform(function (int $item, int $key) {
  3. return $item * 2;
  4. });
  5. $collection->all();
  6. // [2, 4, 6, 8, 10]

注意:与大多数集合方法不同,php transform 会修改集合本身。如果你想创建新集合,可以使用 php map 方法。

php undot()
php undot() 方法将使用「点」表示法的一维集合扩展为多维集合:

  1. $person = collect([
  2. 'name.first_name' => 'Marie',
  3. 'name.last_name' => 'Valentine',
  4. 'address.line_1' => '2992 Eagle Drive',
  5. 'address.line_2' => '',
  6. 'address.suburb' => 'Detroit',
  7. 'address.state' => 'MI',
  8. 'address.postcode' => '48219'
  9. ]);
  10. $person = $person->undot();
  11. $person->toArray();
  12. /*
  13. [
  14. "name" => [
  15. "first_name" => "Marie",
  16. "last_name" => "Valentine",
  17. ],
  18. "address" => [
  19. "line_1" => "2992 Eagle Drive",
  20. "line_2" => "",
  21. "suburb" => "Detroit",
  22. "state" => "MI",
  23. "postcode" => "48219",
  24. ],
  25. ]
  26. */

php union()
php union 方法将给定数组添加到集合中。如果给定的数组含有与原集合一样的键,则首选原始集合的值:

  1. $collection = collect([1 => ['a'], 2 => ['b']]);
  2. $union = $collection->union([3 => ['c'], 1 => ['d']]);
  3. $union->all();
  4. // [1 => ['a'], 2 => ['b'], 3 => ['c']]

php unique()
php unique 方法返回集合中所有唯一项。返回的集合保留着原数组的键,所以在这个例子中,我们使用 php values 方法把键重置为连续编号的索引:

  1. $collection = collect([1, 1, 2, 2, 3, 4, 2]);
  2. $unique = $collection->unique();
  3. $unique->values()->all();
  4. // [1, 2, 3, 4]

当处理嵌套数组或对象时,你可以指定用于确定唯一性的键:

  1. $collection = collect([
  2. ['name' => 'iPhone 6', 'brand' => 'Apple', 'type' => 'phone'],
  3. ['name' => 'iPhone 5', 'brand' => 'Apple', 'type' => 'phone'],
  4. ['name' => 'Apple Watch', 'brand' => 'Apple', 'type' => 'watch'],
  5. ['name' => 'Galaxy S6', 'brand' => 'Samsung', 'type' => 'phone'],
  6. ['name' => 'Galaxy Gear', 'brand' => 'Samsung', 'type' => 'watch'],
  7. ]);
  8. $unique = $collection->unique('brand');
  9. $unique->values()->all();
  10. /*
  11. [
  12. ['name' => 'iPhone 6', 'brand' => 'Apple', 'type' => 'phone'],
  13. ['name' => 'Galaxy S6', 'brand' => 'Samsung', 'type' => 'phone'],
  14. ]
  15. */

最后,你还可以将自己的闭包传递给该 php unique 方法,以指定哪个值应确定项目的唯一性:

  1. $unique = $collection->unique(function (array $item) {
  2. return $item['brand'].$item['type'];
  3. });
  4. $unique->values()->all();
  5. /*
  6. [
  7. ['name' => 'iPhone 6', 'brand' => 'Apple', 'type' => 'phone'],
  8. ['name' => 'Apple Watch', 'brand' => 'Apple', 'type' => 'watch'],
  9. ['name' => 'Galaxy S6', 'brand' => 'Samsung', 'type' => 'phone'],
  10. ['name' => 'Galaxy Gear', 'brand' => 'Samsung', 'type' => 'watch'],
  11. ]
  12. */

php unique 方法在检查项目值时使用「宽松」模式比较,意味着具有整数值的字符串将被视为等于相同值的整数。你可以使用 php uniqueStrict 方法做「严格」模式比较。

技巧:这个方法的行为在使用 Eloquent 集合 时被修改。

php uniqueStrict()
这个方法与 php unique 方法一样,然而,所有的值是用「严格」模式来比较的。

php unless()
php unless 方法当传入的第一个参数不为 php true 的时候,将执行给定的回调函数:

  1. $collection = collect([1, 2, 3]);
  2. $collection->unless(true, function (Collection $collection) {
  3. return $collection->push(4);
  4. });
  5. $collection->unless(false, function (Collection $collection) {
  6. return $collection->push(5);
  7. });
  8. $collection->all();
  9. // [1, 2, 3, 5]

可以将第二个回调传递给该 php unless 方法。 php unless 当给方法的第一个参数计算结果为时,将执行第二个回调 php true:

  1. $collection = collect([1, 2, 3]);
  2. $collection->unless(true, function (Collection $collection) {
  3. return $collection->push(4);
  4. }, function (Collection $collection) {
  5. return $collection->push(5);
  6. });
  7. $collection->all();
  8. // [1, 2, 3, 5]

php unless 相反的,请参见 php when 方法。

php unlessEmpty()
php whenNotEmpty 的别名方法。

php unlessNotEmpty()
php whenEmpty 的别名方法。

php unwrap()
静态 php unwrap 方法返回集合内部的可用元素:

  1. Collection::unwrap(collect('John Doe'));
  2. // ['John Doe']
  3. Collection::unwrap(['John Doe']);
  4. // ['John Doe']
  5. Collection::unwrap('John Doe');
  6. // 'John Doe'

php value()
php value 方法从集合的第一个元素中检索一个给定的值。

  1. $collection = collect([
  2. ['product' => 'Desk', 'price' => 200],
  3. ['product' => 'Speaker', 'price' => 400],
  4. ]);
  5. $value = $collection->value('price');
  6. // 200

php values()
php values 方法返回键被重置为连续编号的新集合:

  1. $collection = collect([
  2. 10 => ['product' => 'Desk', 'price' => 200],
  3. 11 => ['product' => 'Desk', 'price' => 200],
  4. ]);
  5. $values = $collection->values();
  6. $values->all();
  7. /*
  8. [
  9. 0 => ['product' => 'Desk', 'price' => 200],
  10. 1 => ['product' => 'Desk', 'price' => 200],
  11. ]
  12. */

php when()
php when 方法的第一个参数传入为 php true 时,将执行给定的回调函数。
集合实例和给到 php when 方法的第一个参数将被提供给闭包。

  1. $collection = collect([1, 2, 3]);
  2. $collection->when(true, function (Collection $collection, int $value) {
  3. return $collection->push(4);
  4. });
  5. $collection->when(false, function (Collection $collection, int $value) {
  6. return $collection->push(5);
  7. });
  8. $collection->all();
  9. // [1, 2, 3, 4]

可以将第二个回调传递给该 php when 方法。当给 php when 方法的第一个参数计算结果为 php false 时,将执行第二个回调:

  1. $collection = collect([1, 2, 3]);
  2. $collection->when(false, function (Collection $collection, int $value) {
  3. return $collection->push(4);
  4. }, function (Collection $collection) {
  5. return $collection->push(5);
  6. });
  7. $collection->all();
  8. // [1, 2, 3, 5]

php when 相反的方法,请查看 php unless 方法。

php whenEmpty()
php whenEmpty 方法是当集合为空时,将执行给定的回调函数:

  1. $collection = collect(['Michael', 'Tom']);
  2. $collection->whenEmpty(function (Collection $collection) {
  3. return $collection->push('Adam');
  4. });
  5. $collection->all();
  6. // ['Michael', 'Tom']
  7. $collection = collect();
  8. $collection->whenEmpty(function (Collection $collection) {
  9. return $collection->push('Adam');
  10. });
  11. $collection->all();
  12. // ['Adam']

当集合不为空时,可以将第二个闭包传递给 php whenEmpty 将要执行的方法:

  1. $collection = collect(['Michael', 'Tom']);
  2. $collection->whenEmpty(function (Collection $collection) {
  3. return $collection->push('Adam');
  4. }, function (Collection $collection) {
  5. return $collection->push('Taylor');
  6. });
  7. $collection->all();
  8. // ['Michael', 'Tom', 'Taylor']

php whenEmpty 相反的方法,请查看 php whenNotEmpty 方法。

php whenNotEmpty()
php whenNotEmpty 方法当集合不为空时,将执行给定的回调函数:

  1. $collection = collect(['michael', 'tom']);
  2. $collection->whenNotEmpty(function (Collection $collection) {
  3. return $collection->push('adam');
  4. });
  5. $collection->all();
  6. // ['michael', 'tom', 'adam']
  7. $collection = collect();
  8. $collection->whenNotEmpty(function (Collection $collection) {
  9. return $collection->push('adam');
  10. });
  11. $collection->all();
  12. // []

可以将第二个闭包传递给 php whenNotEmpty 将在集合为空时执行的方法:

  1. $collection = collect();
  2. $collection->whenNotEmpty(function (Collection $collection) {
  3. return $collection->push('adam');
  4. }, function (Collection $collection) {
  5. return $collection->push('taylor');
  6. });
  7. $collection->all();
  8. // ['taylor']

php whenNotEmpty 相反的方法,请查看 php whenEmpty 方法。

php where()
php where 方法通过给定的键 / 值对查询过滤集合的结果:

  1. $collection = collect([
  2. ['product' => 'Desk', 'price' => 200],
  3. ['product' => 'Chair', 'price' => 100],
  4. ['product' => 'Bookcase', 'price' => 150],
  5. ['product' => 'Door', 'price' => 100],
  6. ]);
  7. $filtered = $collection->where('price', 100);
  8. $filtered->all();
  9. /*
  10. [
  11. ['product' => 'Chair', 'price' => 100],
  12. ['product' => 'Door', 'price' => 100],
  13. ]
  14. */

php where 方法在检查集合项值时使用「宽松」模式比较,这意味着具有整数值的字符串会被认为等于相同值的整数。你可以使用 php whereStrict 方法进行「严格」模式比较。

而且,你还可以将一个比较运算符作为第二个参数传递。
支持的运算符是有 ‘===’, ‘!==’, ‘!=’, ‘==’, ‘=’, ‘<>’, ‘>’, ‘<’, ‘>=’, 和 ‘<=’。

  1. $collection = collect([
  2. ['name' => 'Jim', 'deleted_at' => '2019-01-01 00:00:00'],
  3. ['name' => 'Sally', 'deleted_at' => '2019-01-02 00:00:00'],
  4. ['name' => 'Sue', 'deleted_at' => null],
  5. ]);
  6. $filtered = $collection->where('deleted_at', '!=', null);
  7. $filtered->all();
  8. /*
  9. [
  10. ['name' => 'Jim', 'deleted_at' => '2019-01-01 00:00:00'],
  11. ['name' => 'Sally', 'deleted_at' => '2019-01-02 00:00:00'],
  12. ]
  13. */

php whereStrict()
此方法和 php where 方法使用相似;但是它是「严格」模式去匹配值和类型。

php whereBetween()
php whereBetween 方法会筛选给定范围的集合:

  1. $collection = collect([
  2. ['product' => 'Desk', 'price' => 200],
  3. ['product' => 'Chair', 'price' => 80],
  4. ['product' => 'Bookcase', 'price' => 150],
  5. ['product' => 'Pencil', 'price' => 30],
  6. ['product' => 'Door', 'price' => 100],
  7. ]);
  8. $filtered = $collection->whereBetween('price', [100, 200]);
  9. $filtered->all();
  10. /*
  11. [
  12. ['product' => 'Desk', 'price' => 200],
  13. ['product' => 'Bookcase', 'price' => 150],
  14. ['product' => 'Door', 'price' => 100],
  15. ]
  16. */

php whereIn()
php whereIn 方法会根据包含给定数组的键 / 值对来过滤集合:

  1. $collection = collect([
  2. ['product' => 'Desk', 'price' => 200],
  3. ['product' => 'Chair', 'price' => 100],
  4. ['product' => 'Bookcase', 'price' => 150],
  5. ['product' => 'Door', 'price' => 100],
  6. ]);
  7. $filtered = $collection->whereIn('price', [150, 200]);
  8. $filtered->all();
  9. /*
  10. [
  11. ['product' => 'Desk', 'price' => 200],
  12. ['product' => 'Bookcase', 'price' => 150],
  13. ]
  14. */

php whereIn 方法在检查项目值时使用 “loose” 比较,这意味着具有整数值的字符串将被视为等于相同值的整数。使用 php whereInStrict 方法使用「strict」比较进行过滤。

php whereInStrict()
此方法与 php whereIn 方法具有相同的签名;但是,所有值都使用「strict」比较进行比较。

php whereInstanceOf()
php whereInstanceOf 方法按给定的类类型过滤集合:

  1. use App\Models\User;
  2. use App\Models\Post;
  3. $collection = collect([
  4. new User,
  5. new User,
  6. new Post,
  7. ]);
  8. $filtered = $collection->whereInstanceOf(User::class);
  9. $filtered->all();
  10. // [App\Models\User, App\Models\User]

php whereNotBetween()
php whereNotBetween 方法通过确定指定项的值是否超出给定范围来过滤集合:

  1. $collection = collect([
  2. ['product' => 'Desk', 'price' => 200],
  3. ['product' => 'Chair', 'price' => 80],
  4. ['product' => 'Bookcase', 'price' => 150],
  5. ['product' => 'Pencil', 'price' => 30],
  6. ['product' => 'Door', 'price' => 100],
  7. ]);
  8. $filtered = $collection->whereNotBetween('price', [100, 200]);
  9. $filtered->all();
  10. /*
  11. [
  12. ['product' => 'Chair', 'price' => 80],
  13. ['product' => 'Pencil', 'price' => 30],
  14. ]
  15. */

php whereNotIn()
php whereNotIn 方法从集合中删除具有给定数组中包含的指定项值的元素:

  1. $collection = collect([
  2. ['product' => 'Desk', 'price' => 200],
  3. ['product' => 'Chair', 'price' => 100],
  4. ['product' => 'Bookcase', 'price' => 150],
  5. ['product' => 'Door', 'price' => 100],
  6. ]);
  7. $filtered = $collection->whereNotIn('price', [150, 200]);
  8. $filtered->all();
  9. /*
  10. [
  11. ['product' => 'Chair', 'price' => 100],
  12. ['product' => 'Door', 'price' => 100],
  13. ]
  14. */

php whereNotIn 方法在检查项目值时使用「loose」比较,这意味着具有整数值的字符串将被视为等于具有相同值的整数。使用 php whereNotInStrict 方法使用「strict」比较进行过滤。

php whereNotInStrict()
这个方法与 php whereNotIn 方法类似;不同的是会使用「严格」模式比较。

php whereNotNull()
php whereNotNull 方法筛选给定键不为 php null的项:

  1. $collection = collect([
  2. ['name' => 'Desk'],
  3. ['name' => null],
  4. ['name' => 'Bookcase'],
  5. ]);
  6. $filtered = $collection->whereNotNull('name');
  7. $filtered->all();
  8. /*
  9. [
  10. ['name' => 'Desk'],
  11. ['name' => 'Bookcase'],
  12. ]
  13. */

php whereNull()
php whereNull 方法筛选给定键为 php null的项:

  1. $collection = collect([
  2. ['name' => 'Desk'],
  3. ['name' => null],
  4. ['name' => 'Bookcase'],
  5. ]);
  6. $filtered = $collection->whereNull('name');
  7. $filtered->all();
  8. /*
  9. [
  10. ['name' => null],
  11. ]
  12. */

php wrap()
静态 php wrap 方法会将给定值封装到集合中:

  1. use Illuminate\Support\Collection;
  2. $collection = Collection::wrap('John Doe');
  3. $collection->all();
  4. // ['John Doe']
  5. $collection = Collection::wrap(['John Doe']);
  6. $collection->all();
  7. // ['John Doe']
  8. $collection = Collection::wrap(collect('John Doe'));
  9. $collection->all();
  10. // ['John Doe']

php zip()
php zip 方法在与集合的值对应的索引处合并给定数组的值:

  1. $collection = collect(['Chair', 'Desk']);
  2. $zipped = $collection->zip([100, 200]);
  3. $zipped->all();
  4. // [['Chair', 100], ['Desk', 200]]

Higher Order Messages

集合也提供对「高阶消息传递」的支持,即集合常见操作的快捷方式。支持高阶消息传递的集合方法有: php averagephp avgphp containsphp eachphp everyphp filterphp firstphp flatMapphp groupByphp keyByphp mapphp maxphp minphp partitionphp rejectphp skipUntilphp skipWhilephp somephp sortByphp sortByDescphp sumphp takeUntilphp takeWhilephp unique

每个高阶消息都可以作为集合实例上的动态属性进行访问。例如,让我们使用 php each 高阶消息来调用集合中每个对象的方法:

  1. use App\Models\User;
  2. $users = User::where('votes', '>', 500)->get();
  3. $users->each->markAsVip();

同样,我们可以使用 php sum 高阶消息来收集用户集合的「votes」总数:

  1. $users = User::where('group', 'Development')->get();
  2. return $users->sum->votes;

惰性集合

介绍

注意:在进一步了解 Laravel 的惰性集合之前,花点时间熟悉一下 PHP 生成器.

为了补充已经强大的 php Collection 类,php LazyCollection 类利用 PHP 的 generators 允许你使用非常 大型数据集,同时保持较低的内存使用率。

例如,假设你的应用程序需要处理数 GB 的日志文件,同时利用 Laravel 的集合方法来解析日志。可以使用惰性集合在给定时间仅将文件的一小部分保留在内存中,而不是一次将整个文件读入内存:

  1. use App\Models\LogEntry;
  2. use Illuminate\Support\LazyCollection;
  3. LazyCollection::make(function () {
  4. $handle = fopen('log.txt', 'r');
  5. while (($line = fgets($handle)) !== false) {
  6. yield $line;
  7. }
  8. })->chunk(4)->map(function (array $lines) {
  9. return LogEntry::fromLines($lines);
  10. })->each(function (LogEntry $logEntry) {
  11. // Process the log entry...
  12. });

或者,假设你需要遍历 10,000 个 Eloquent 模型。使用传统 Laravel 集合时,所有 10,000 个 Eloquent 模型必须同时加载到内存中:

  1. use App\Models\User;
  2. $users = User::all()->filter(function (User $user) {
  3. return $user->id > 500;
  4. });

但是,查询构建器的 php cursor 方法返回一个 php LazyCollection 实例。这允许你仍然只对数据库运行一个查询,而且一次只在内存中加载一个 Eloquent 模型。在这个例子中,php filter 回调在我们实际单独遍历每个用户之前不会执行,从而可以大幅减少内存使用量:

  1. use App\Models\User;
  2. $users = User::cursor()->filter(function (User $user) {
  3. return $user->id > 500;
  4. });
  5. foreach ($users as $user) {
  6. echo $user->id;
  7. }

创建惰性集合

要创建惰性集合实例,你应该将 PHP 生成器函数传递给集合的 php make 方法:

  1. use Illuminate\Support\LazyCollection;
  2. LazyCollection::make(function () {
  3. $handle = fopen('log.txt', 'r');
  4. while (($line = fgets($handle)) !== false) {
  5. yield $line;
  6. }
  7. });

枚举契约

php Collection 类上几乎所有可用的方法也可以在 php LazyCollection 类上使用。这两个类都实现了 php Illuminate\Support\Enumerable 契约,它定义了以下方法:

all
average
avg
chunk
chunkWhile
collapse
collect
combine
concat
contains
containsStrict
count
countBy
crossJoin
dd
diff
diffAssoc
diffKeys
dump
duplicates
duplicatesStrict
each
eachSpread
every
except
filter
first
firstOrFail
firstWhere
flatMap
flatten
flip
forPage
get
groupBy
has
implode
intersect
intersectAssoc
intersectByKeys
isEmpty
isNotEmpty
join
keyBy
keys
last
macro
make
map
mapInto
mapSpread
mapToGroups
mapWithKeys
max
median
merge
mergeRecursive
min
mode
nth
only
pad
partition
pipe
pluck
random
reduce
reject
replace
replaceRecursive
reverse
search
shuffle
skip
slice
sole
some
sort
sortBy
sortByDesc
sortKeys
sortKeysDesc
split
sum
take
tap
times
toArray
toJson
union
unique
uniqueStrict
unless
unlessEmpty
unlessNotEmpty
unwrap
values
when
whenEmpty
whenNotEmpty
where
whereStrict
whereBetween
whereIn
whereInStrict
whereInstanceOf
whereNotBetween
whereNotIn
whereNotInStrict
wrap
zip

注意:改变集合的方法(例如 php shiftphp popphp prepend 等)在 php LazyCollection 类中不可用。

惰性集合方法

除了在 php Enumerable 契约中定义的方法外, php LazyCollection 类还包含以下方法:

php takeUntilTimeout()
php takeUntilTimeout 方法返回新的惰性集合,它会在给定时间前去枚举集合值,之后集合将停止枚举:

  1. $lazyCollection = LazyCollection::times(INF)
  2. ->takeUntilTimeout(now()->addMinute());
  3. $lazyCollection->each(function (int $number) {
  4. dump($number);
  5. sleep(1);
  6. });
  7. // 1
  8. // 2
  9. // ...
  10. // 58
  11. // 59

为了具体阐述此方法,请设想一个使用游标从数据库提交发票的例子。你可以定义一个 计划任务,它每十五分钟执行一次,并且只执行发票提交操作的最大时间是 14 分钟:

  1. use App\Models\Invoice;
  2. use Illuminate\Support\Carbon;
  3. Invoice::pending()->cursor()
  4. ->takeUntilTimeout(
  5. Carbon::createFromTimestamp(LARAVEL_START)->add(14, 'minutes')
  6. )
  7. ->each(fn (Invoice $invoice) => $invoice->submit());

php tapEach()
php each 方法为集合中每一个元素调用给定回调时, php tapEach 方法仅调用给定回调,因为这些元素正在逐个从列表中拉出:

  1. // 没有任何输出
  2. $lazyCollection = LazyCollection::times(INF)->tapEach(function (int $value) {
  3. dump($value);
  4. });
  5. // 打印出三条数据
  6. $array = $lazyCollection->take(3)->all();
  7. // 1
  8. // 2
  9. // 3

php remember()
php remember 方法返回一个新的惰性集合,这个集合已经记住(缓存)已枚举的所有值,当再次枚举该集合时不会获取它们:

  1. // 没执行任何查询
  2. $users = User::cursor()->remember();
  3. // 执行了查询操作
  4. // The first 5 users are hydrated from the database...
  5. $users->take(5)->all();
  6. // 前 5 个用户数据从缓存中获取
  7. // The rest are hydrated from the database...
  8. $users->take(20)->all();

本文章首发在 网站上。