A classe Illuminate\Support\Collection
fornece um recorte fácil e conveniente para trabalhar com conjuntos de dados. Por exemplo, confira o código a seguir: usaremos o auxiliar collect
para criar uma nova instância da coleção do array, executar a função strtoupper em cada elemento e, então, remover os elementos vazios:
$collection = collect(['taylor', 'abigail', null])->map(function (?string $name) {
return strtoupper($name);
})->reject(function (string $name) {
return empty($name);
});
Como você pode ver, a classe Collection
permite que você combine seus métodos para executar mapeamento fluido e redução do array subjacente. Em geral, as coleções são imutáveis, o que significa que cada método da Collection
retorna uma nova instância de Collection
.
Como mencionado acima, o recurso collect
retorna uma nova instância Illuminate\Support\Collection
para o array especificado. Então criar uma coleção é tão simples quanto isto:
$collection = collect([1, 2, 3]);
[!ATENÇÃO] Todas as consultas do eloqüente são sempre retornadas como instâncias da coleção.
As coleções são "macroable", o que permite adicionar métodos adicionais à classe Collection
no momento da execução. O método Illuminate\Support\Collection
aceita um closure que será executado quando o macro for chamado. O closure de macro tem acesso aos outros métodos da coleção por meio do $this
, assim como se fosse um verdadeiro método da classe de coleções. Por exemplo, o código a seguir adiciona um método toUpper
à classe Collection
:
use Illuminate\Support\Collection;
use Illuminate\Support\Str;
Collection::macro('toUpper', function () {
return $this->map(function (string $value) {
return Str::upper($value);
});
});
$collection = collect(['first', 'second']);
$upper = $collection->toUpper();
// ['FIRST', 'SECOND']
Normalmente, você deve declarar os macro de coleção no método boot
de um provedor de serviço.
Se necessário, você pode definir macros que aceitem argumentos adicionais:
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Lang;
Collection::macro('toLocale', function (string $locale) {
return $this->map(function (string $value) use ($locale) {
return Lang::get($value, [], $locale);
});
});
$collection = collect(['first', 'second']);
$translated = $collection->toLocale('es');
Para a maioria das documentações restantes de coleções, discutiremos cada método disponível na classe Collection. Lembre-se que todos esses métodos podem ser concatenados para manipular o array subjacente de forma fluida. Além disso, quase todos os métodos retornam uma nova instância da coleção, permitindo que você preserve a cópia original quando necessário:
<style> .collection-method-list > p { columns: 10.8em 3; -moz-columns: 10.8em 3; -webkit-columns: 10.8em 3; } .collection-method-list a { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } </style>after all average avg before chunk chunkWhile collapse collect combine concat contains containsOneItem containsStrict count countBy crossJoin dd diff diffAssoc diffAssocUsing diffKeys doesntContain dot dump duplicates duplicatesStrict each eachSpread ensure 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 percentage pipe pipeInto pipeThrough pluck pop prepend pull push put random range reduce reduceSpread reject replace replaceRecursive reverse search select 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
O método after
retorna o elemento após o item especificado. Se o item não for encontrado, ou se esse elemento for o último, será retornado null
:
$collection = collect([1, 2, 3, 4, 5]);
$collection->after(3);
// 4
$collection->after(5);
// null
Este método procura o elemento especificado com uma comparação "fria", o que significa que uma string contendo um valor numérico será considerada igual a um número inteiro do mesmo valor. Para usar a comparação "rigorosa" você pode fornecer o argumento strict
ao método:
collect([2, 4, 6, 8])->after('4', strict: true);
// null
Como alternativa, você poderá fornecer o próprio closure para procurar pelo primeiro elemento que passa em um determinado teste de verdade:
collect([2, 4, 6, 8])->after(function (int $item, int $key) {
return $item > 5;
});
// 8
O método all()
retorna o vetor subjacente representado pela coleção:
collect([1, 2, 3])->all();
// [1, 2, 3]
Aliases para o método avg
.
O método avg
retorna o valor médio de uma chave especificada:
$average = collect([
['foo' => 10],
['foo' => 10],
['foo' => 20],
['foo' => 40]
])->avg('foo');
// 20
$average = collect([1, 1, 2, 4])->avg();
// 2
O método before
é o oposto do método after
. Ele retorna o item anteriores ao item dado. Caso o item não seja encontrado ou seja o primeiro item, será retornado null
:
$collection = collect([1, 2, 3, 4, 5]);
$collection->before(3);
// 2
$collection->before(1);
// null
collect([2, 4, 6, 8])->before('4', strict: true);
// null
collect([2, 4, 6, 8])->before(function (int $item, int $key) {
return $item > 5;
});
// 4
O método chunk
divide o conjunto em vários conjuntos menores de um tamanho especificado:
$collection = collect([1, 2, 3, 4, 5, 6, 7]);
$chunks = $collection->chunk(4);
$chunks->all();
// [[1, 2, 3, 4], [5, 6, 7]]
Esse método é especialmente útil em visualizações, quando você trabalha com sistemas de grid, como o Bootstrap (Bootstrap). Por exemplo, imagine que você tenha uma coleção de modelos Eloquent que precisa exibir em um grid:
@foreach ($products->chunk(3) as $chunk)
<div class="row">
@foreach ($chunk as $product)
<div class="col-xs-4">{{ $product->name }}</div>
@endforeach
</div>
@endforeach
O método chunkWhile
divide a coleção em várias sub-coleções com base na avaliação do callback fornecido. A variável $chunk
, passada ao closure, pode ser utilizada para inspecionar o elemento anterior:
$collection = collect(str_split('AABBCCCD'));
$chunks = $collection->chunkWhile(function (string $value, int $key, Collection $chunk) {
return $value === $chunk->last();
});
$chunks->all();
// [['A', 'A'], ['B', 'B'], ['C', 'C', 'C'], ['D']]
O método collapse
reduz a coleção de arrays a uma única coleção plana:
$collection = collect([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
]);
$collapsed = $collection->collapse();
$collapsed->all();
// [1, 2, 3, 4, 5, 6, 7, 8, 9]
O método collect
retorna uma nova instância de Collection
com os itens atualmente na coleção:
$collectionA = collect([1, 2, 3]);
$collectionB = $collectionA->collect();
$collectionB->all();
// [1, 2, 3]
O método collect
é primariamente útil para converter coleções lentas em instâncias Collection
padrão:
$lazyCollection = LazyCollection::make(function () {
yield 1;
yield 2;
yield 3;
});
$collection = $lazyCollection->collect();
$collection::class;
// 'Illuminate\Support\Collection'
$collection->all();
// [1, 2, 3]
::: info NOTA
O método collect
é especialmente útil quando você tem uma instância do Enumerable
e precisa de uma instância de coleção não-lenta (non-lazy). Como o collect()
faz parte do contrato do Enumerable
, você pode usá-lo com segurança para obter uma instância da classe Collection
.
:::
O método combine
combina os valores da coleção, como chaves, com os valores de outro array ou coleção.
$collection = collect(['name', 'age']);
$combined = $collection->combine(['George', 29]);
$combined->all();
// ['name' => 'George', 'age' => 29]
O método concat
adiciona os valores do(s) array(s) ou coleção(ões) ao final de outra coleção.
$collection = collect(['John Doe']);
$concatenated = $collection->concat(['Jane Doe'])->concat(['name' => 'Johnny Doe']);
$concatenated->all();
// ['John Doe', 'Jane Doe', 'Johnny Doe']
O método concat
altera numericamente os índices de chave dos itens concatendos à coleção original. Para manter as chaves em coleções associativas, consulte o método merge.
O método contains
determina se uma determinada coleção contém um determinado elemento. Pode ser enviada para o método contains
uma função closure, de forma a verificar se numa determinada entrada da lista existe um elemento que corresponda a uma validação definida:
$collection = collect([1, 2, 3, 4, 5]);
$collection->contains(function (int $value, int $key) {
return $value > 5;
});
// false
Alternativamente, você pode passar uma string para o método contains
para determinar se a coleção contém um determinado valor de item:
$collection = collect(['name' => 'Desk', 'price' => 100]);
$collection->contains('Desk');
// true
$collection->contains('New York');
// false
Você também pode passar uma chave/par de valores para o método contains
, que determinará se o par fornecido existe na coleção:
$collection = collect([
['product' => 'Desk', 'price' => 200],
['product' => 'Chair', 'price' => 100],
]);
$collection->contains('product', 'Bookcase');
// false
O método contains
usa comparações "frouxas" ao verificar os valores dos itens, o que significa que uma string com um valor inteiro será considerada igual a um inteiro do mesmo valor. Para efetuar filtragem com comparações "rigorosas", use o método containsStrict
.
O inverso do método contains
é o método doesntContain.
O método containsOneItem
indica se a coleção contém um único item:
collect([])->containsOneItem();
// false
collect(['1'])->containsOneItem();
// true
collect(['1', '2'])->containsOneItem();
// false
Este método tem a mesma assinatura que o método contains
. No entanto, todos os valores são verificados usando comparações "rigorosas".
::: info NOTA O comportamento deste método é modificado ao usar Coleções do Eloquent. :::
O método count
retorna o número total de itens da coleção:
$collection = collect([1, 2, 3, 4]);
$collection->count();
// 4
O método countBy
conta as ocorrências de valores na coleção. Por padrão, o método conta todas as ocorrências do elemento, permitindo contar certos "tipos" de elementos na coleção:
$collection = collect([1, 2, 2, 2, 3]);
$counted = $collection->countBy();
$counted->all();
// [1 => 1, 2 => 3, 3 => 1]
Você pode passar um closure para o método countBy
, para contar todos os itens com base num critério personalizado:
$collection = collect(['[email protected]', '[email protected]', '[email protected]']);
$counted = $collection->countBy(function (string $email) {
return substr(strrchr($email, "@"), 1);
});
$counted->all();
// ['gmail.com' => 2, 'yahoo.com' => 1]
O método crossJoin
realiza uma operação de cruzamento entre os valores da coleção e dos conjuntos ou matrizes fornecidos, retornando um produto cartesiano com todas as permutações possíveis:
$collection = collect([1, 2]);
$matrix = $collection->crossJoin(['a', 'b']);
$matrix->all();
/*
[
[1, 'a'],
[1, 'b'],
[2, 'a'],
[2, 'b'],
]
*/
$collection = collect([1, 2]);
$matrix = $collection->crossJoin(['a', 'b'], ['I', 'II']);
$matrix->all();
/*
[
[1, 'a', 'I'],
[1, 'a', 'II'],
[1, 'b', 'I'],
[1, 'b', 'II'],
[2, 'a', 'I'],
[2, 'a', 'II'],
[2, 'b', 'I'],
[2, 'b', 'II'],
]
*/
O método dd
exclui os itens da coleção e termina a execução do script:
$collection = collect(['John Doe', 'Jane Doe']);
$collection->dd();
/*
Collection {
#items: array:2 [
0 => "John Doe"
1 => "Jane Doe"
]
}
*/
Se você não quiser interromper o processamento do script, use o método dump
.
O método diff
compara a coleção com outra coleção ou um simples array de PHP baseado em seus valores. Esse método retornará os valores da coleção original que não estão presentes na coleção especificada:
$collection = collect([1, 2, 3, 4, 5]);
$diff = $collection->diff([2, 4, 6, 8]);
$diff->all();
// [1, 3, 5]
::: info NOTA O comportamento deste método é modificado ao usar Coleções Eloquent. :::
O método diffAssoc
compara uma coleção com outra coleção ou um simples array PHP, com base em chaves e valores. Este método retorna as pares de chave/valor na matriz original que não estão presentes na matriz especificada:
$collection = collect([
'color' => 'orange',
'type' => 'fruit',
'remain' => 6,
]);
$diff = $collection->diffAssoc([
'color' => 'yellow',
'type' => 'fruit',
'remain' => 3,
'used' => 6,
]);
$diff->all();
// ['color' => 'orange', 'remain' => 6]
Ao contrário do diffAssoc
, o diffAssocUsing
aceita uma função de retorno do usuário para comparação dos índices.
$collection = collect([
'color' => 'orange',
'type' => 'fruit',
'remain' => 6,
]);
$diff = $collection->diffAssocUsing([
'Color' => 'yellow',
'Type' => 'fruit',
'Remain' => 3,
], 'strnatcasecmp');
$diff->all();
// ['color' => 'orange', 'remain' => 6]
A função de retorno deve ser uma função de comparação que retorne um número inteiro menor, igual ou maior do que zero. Para mais informações, consulte a documentação PHP sobre array_diff_uassoc
, uma função PHP que a sua função diffAssocUsing
utiliza internamente.
O método diffKeys
compara a coleção com outra coleção ou um simples array
PHP, com base em suas chaves. Este método retorna as pares de chave/valor da coleção original que não estão presentes na coleção fornecida:
$collection = collect([
'one' => 10,
'two' => 20,
'three' => 30,
'four' => 40,
'five' => 50,
]);
$diff = $collection->diffKeys([
'two' => 2,
'four' => 4,
'six' => 6,
'eight' => 8,
]);
$diff->all();
// ['one' => 10, 'three' => 30, 'five' => 50]
O método doesntContain
determina se a coleção não contém um determinado item. Pode ser fornecido um bloco de expressão para o método doesntContain
com o objetivo de determinar se um elemento não existe na coleção, que corresponda a um teste lógico especificado:
$collection = collect([1, 2, 3, 4, 5]);
$collection->doesntContain(function (int $value, int $key) {
return $value < 5;
});
// false
Alternativamente, você pode passar uma string para o método doesntContain
para determinar se a coleção não contém um determinado valor do item.
$collection = collect(['name' => 'Desk', 'price' => 100]);
$collection->doesntContain('Table');
// true
$collection->doesntContain('Desk');
// false
Você também pode passar um par chave/valor para o método doesntContain
, que determinará se o par fornecido não existe na coleção:
$collection = collect([
['product' => 'Desk', 'price' => 200],
['product' => 'Chair', 'price' => 100],
]);
$collection->doesntContain('product', 'Bookcase');
// true
O método doesntContain
utiliza comparações "fracas" quando verifica os valores de itens, ou seja, uma string com um valor inteiro será considerada igual a um inteiro com o mesmo valor.
O método dot
reorganiza uma coleção multidimensional em uma coleção de um só nível, com notação de "ponto" para indicar a profundidade.
$collection = collect(['products' => ['desk' => ['price' => 100]]]);
$flattened = $collection->dot();
$flattened->all();
// ['products.desk.price' => 100]
O método dump
transfere os itens da coleção:
$collection = collect(['John Doe', 'Jane Doe']);
$collection->dump();
/*
Collection {
#items: array:2 [
0 => "John Doe"
1 => "Jane Doe"
]
}
*/
Se você desejar parar a execução do script depois de exportar a coleção, utilize o método dd.
O método duplicates
recupera e devolve os valores duplicados da coleção:
$collection = collect(['a', 'b', 'a', 'c', 'b']);
$collection->duplicates();
// [2 => 'a', 4 => 'b']
Se a coleção conter matrizes ou objetos, você pode passar a chave dos atributos que deseja verificar em busca de valores duplicados:
$employees = collect([
['email' => '[email protected]', 'position' => 'Developer'],
['email' => '[email protected]', 'position' => 'Designer'],
['email' => '[email protected]', 'position' => 'Developer'],
]);
$employees->duplicates('position');
// [2 => 'Developer']
Este método tem a mesma assinatura do método duplicates
; no entanto, todos os valores são comparados utilizando comparações estritas.
O método each
percorre os itens de uma coleção e passa cada um deles para o bloco de código:
$collection = collect([1, 2, 3, 4]);
$collection->each(function (int $item, int $key) {
// ...
});
Se você pretender parar de fazer uma iteração através dos elementos, pode retornar false
a partir da sua função anônima:
$collection->each(function (int $item, int $key) {
if (/* condition */) {
return false;
}
});
O método eachSpread
é executado em cada um dos itens da coleção, passando o valor do item aninhado para a função de retorno da chamada de callback:
$collection = collect([['John Doe', 35], ['Jane Doe', 33]]);
$collection->eachSpread(function (string $name, int $age) {
// ...
});
Você pode parar a iteração através dos elementos ao retornar false
do callback:
$collection->eachSpread(function (string $name, int $age) {
return false;
});
O método ensure
pode ser usado para verificar que todos os elementos de uma coleção são do tipo ou lista de tipos especificados. Caso contrário, a exceção UnexpectedValueException
será lançada:
return $collection->ensure(User::class);
return $collection->ensure([User::class, Customer::class]);
Tipos primitivos, tais como "string", "int", "float", "bool" e "array", também podem ser especificados:
return $collection->ensure('int');
::: warning ATENÇÃO
O método ensure
não garante que elementos de tipos diferentes não serão adicionados à coleção posteriormente.
:::
O método every
pode ser usado para verificar se todos os elementos de uma coleção atendem a um determinado teste de verdade:
collect([1, 2, 3, 4])->every(function (int $value, int $key) {
return $value > 2;
});
// false
Se a coleção estiver vazia, o método every
retornará verdadeiro:
$collection = collect([]);
$collection->every(function (int $value, int $key) {
return $value > 2;
});
// true
O método except
retorna todos os itens da coleção exceto aqueles com as chaves especificadas:
$collection = collect(['product_id' => 1, 'price' => 100, 'discount' => false]);
$filtered = $collection->except(['price', 'discount']);
$filtered->all();
// ['product_id' => 1]
Para o inverso de except
, consulte o método only.
::: info NOTA O comportamento deste método é modificado ao usar Coleções do Eloquent. :::
O método filter
filtra a coleção usando o callback fornecido, mantendo apenas os itens que passam no teste verdadeiro:
$collection = collect([1, 2, 3, 4]);
$filtered = $collection->filter(function (int $value, int $key) {
return $value > 2;
});
$filtered->all();
// [3, 4]
Se não for fornecido um callback, todas as entradas da coleção equivalentes a false
serão removidas:
$collection = collect([1, 2, 3, null, false, '', 0, []]);
$collection->filter()->all();
// [1, 2, 3]
Para o inverso do método filter
, consulte o método reject.
O método first
retorna o primeiro elemento da coleção que passa num determinado teste de verdade:
collect([1, 2, 3, 4])->first(function (int $value, int $key) {
return $value > 2;
});
// 3
Você também pode chamar o método first
sem argumentos para conseguir o primeiro elemento da coleção. Se a coleção estiver vazia, será retornado null
:
collect([1, 2, 3, 4])->first();
// 1
O método firstOrFail
é idêntico ao método first
; contudo, se não for encontrado nenhum resultado, será lançada uma exceção Illuminate\Support\ItemNotFoundException
:
collect([1, 2, 3, 4])->firstOrFail(function (int $value, int $key) {
return $value > 5;
});
// Throws ItemNotFoundException...
Você também pode chamar o método firstOrFail
sem nenhum argumento para obter o primeiro elemento da coleção. Caso a coleção esteja vazia, será lançada uma exceção Illuminate\Support\ItemNotFoundException
:
collect([])->firstOrFail();
// Throws ItemNotFoundException...
O método firstWhere
retorna o primeiro elemento da coleção com a dupla chave/valor especificada:
$collection = collect([
['name' => 'Regena', 'age' => null],
['name' => 'Linda', 'age' => 14],
['name' => 'Diego', 'age' => 23],
['name' => 'Linda', 'age' => 84],
]);
$collection->firstWhere('name', 'Linda');
// ['name' => 'Linda', 'age' => 14]
Você também pode chamar o método firstWhere
com um operador de comparação:
$collection->firstWhere('age', '>=', 18);
// ['name' => 'Diego', 'age' => 23]
Como no método where, você pode passar um argumento ao método firstWhere
. Nesse cenário, o método firstWhere
retornará o primeiro item em que o valor da chave do item for verdadeiro:
$collection->firstWhere('age');
// ['name' => 'Linda', 'age' => 14]
O método flatMap
percorre uma coleção e passa cada valor para o bloco de código especificado. O bloco de código é livre para modificar os itens e retorná-los, formando assim uma nova coleção de itens modificados. Em seguida, o array é "achatado" por um nível:
$collection = collect([
['name' => 'Sally'],
['school' => 'Arkansas'],
['age' => 28]
]);
$flattened = $collection->flatMap(function (array $values) {
return array_map('strtoupper', $values);
});
$flattened->all();
// ['name' => 'SALLY', 'school' => 'ARKANSAS', 'age' => '28'];
O método flatten
reordeniza uma coleção multidimensional para um único nível:
$collection = collect([
'name' => 'taylor',
'languages' => [
'php', 'javascript'
]
]);
$flattened = $collection->flatten();
$flattened->all();
// ['taylor', 'php', 'javascript'];
Se necessário, você pode passar para o método flatten
um parâmetro "depth":
$collection = collect([
'Apple' => [
[
'name' => 'iPhone 6S',
'brand' => 'Apple'
],
],
'Samsung' => [
[
'name' => 'Galaxy S7',
'brand' => 'Samsung'
],
],
]);
$products = $collection->flatten(1);
$products->values()->all();
/*
[
['name' => 'iPhone 6S', 'brand' => 'Apple'],
['name' => 'Galaxy S7', 'brand' => 'Samsung'],
]
*/
Neste exemplo, ao chamar o método flatten
sem especificar a profundidade, os arrays aninhados também seriam achatados, resultando em ['iPhone 6S', 'Apple', 'Galaxy S7', 'Samsung']
. Ao fornecer uma profundidade você pode especificar o número de níveis que os arrays aninhados serão achatados.
O método flip
troca as chaves da coleção com os valores correspondentes:
$collection = collect(['name' => 'taylor', 'framework' => 'laravel']);
$flipped = $collection->flip();
$flipped->all();
// ['taylor' => 'name', 'laravel' => 'framework']
O método forget
remove um item da coleção por meio de seu identificador:
$collection = collect(['name' => 'taylor', 'framework' => 'laravel']);
$collection->forget('name');
$collection->all();
// ['framework' => 'laravel']
::: warning ATENÇÃO
Ao contrário da maioria dos outros métodos de coleção, o forget
não retorna uma nova coleção modificada; ela modifica a própria coleção em que foi chamado.
:::
O método forPage
retorna uma nova coleção contendo os itens que estarão presentes no número da página especificada. O método aceita o número da página como seu primeiro argumento e o número de itens a exibir por página como seu segundo argumento:
$collection = collect([1, 2, 3, 4, 5, 6, 7, 8, 9]);
$chunk = $collection->forPage(2, 3);
$chunk->all();
// [4, 5, 6]
O método get
retorna o item de um dado chave. Se a chave não existir, será retornado null
:
$collection = collect(['name' => 'taylor', 'framework' => 'laravel']);
$value = $collection->get('name');
// taylor
Opcionalmente, você pode definir um valor padrão como o segundo argumento:
$collection = collect(['name' => 'taylor', 'framework' => 'laravel']);
$value = $collection->get('age', 34);
// 34
Você pode até mesmo passar um retorno de chamada como valor padrão do método. Se a chave especificada não existir, o resultado da função será retornado:
$collection->get('email', function () {
return '[email protected]';
});
// [email protected]
O método groupBy
agrupa os itens da coleção por uma chave especificada:
$collection = collect([
['account_id' => 'account-x10', 'product' => 'Chair'],
['account_id' => 'account-x10', 'product' => 'Bookcase'],
['account_id' => 'account-x11', 'product' => 'Desk'],
]);
$grouped = $collection->groupBy('account_id');
$grouped->all();
/*
[
'account-x10' => [
['account_id' => 'account-x10', 'product' => 'Chair'],
['account_id' => 'account-x10', 'product' => 'Bookcase'],
],
'account-x11' => [
['account_id' => 'account-x11', 'product' => 'Desk'],
],
]
*/
Em vez de passar uma string como argumento, você pode usar um callback. O callback deve retornar o valor que será usado para chavear o grupo:
$grouped = $collection->groupBy(function (array $item, int $key) {
return substr($item['account_id'], -3);
});
$grouped->all();
/*
[
'x10' => [
['account_id' => 'account-x10', 'product' => 'Chair'],
['account_id' => 'account-x10', 'product' => 'Bookcase'],
],
'x11' => [
['account_id' => 'account-x11', 'product' => 'Desk'],
],
]
*/
Você pode passar vários critérios de agrupamento como um array. Cada elemento do array será aplicado ao nível correspondente em um array multidimensional:
$data = new Collection([
10 => ['user' => 1, 'skill' => 1, 'roles' => ['Role_1', 'Role_3']],
20 => ['user' => 2, 'skill' => 1, 'roles' => ['Role_1', 'Role_2']],
30 => ['user' => 3, 'skill' => 2, 'roles' => ['Role_1']],
40 => ['user' => 4, 'skill' => 2, 'roles' => ['Role_2']],
]);
$result = $data->groupBy(['skill', function (array $item) {
return $item['roles'];
}], preserveKeys: true);
/*
[
1 => [
'Role_1' => [
10 => ['user' => 1, 'skill' => 1, 'roles' => ['Role_1', 'Role_3']],
20 => ['user' => 2, 'skill' => 1, 'roles' => ['Role_1', 'Role_2']],
],
'Role_2' => [
20 => ['user' => 2, 'skill' => 1, 'roles' => ['Role_1', 'Role_2']],
],
'Role_3' => [
10 => ['user' => 1, 'skill' => 1, 'roles' => ['Role_1', 'Role_3']],
],
],
2 => [
'Role_1' => [
30 => ['user' => 3, 'skill' => 2, 'roles' => ['Role_1']],
],
'Role_2' => [
40 => ['user' => 4, 'skill' => 2, 'roles' => ['Role_2']],
],
],
];
*/
O método has
determinará se existe uma chave específica na coleção:
$collection = collect(['account_id' => 1, 'product' => 'Desk', 'amount' => 5]);
$collection->has('product');
// true
$collection->has(['product', 'amount']);
// true
$collection->has(['amount', 'price']);
// false
O método hasAny
determina se algumas das chaves indicadas existem na coleção:
$collection = collect(['account_id' => 1, 'product' => 'Desk', 'amount' => 5]);
$collection->hasAny(['product', 'price']);
// true
$collection->hasAny(['name', 'price']);
// false
O método implode
une os itens de uma coleção. Seus argumentos dependem do tipo de item na coleção. Caso a coleção contenha arrays ou objetos, você deve passar o índice dos atributos que deseja unir e a string "glue" (cola) que deseja utilizar entre os valores:
$collection = collect([
['account_id' => 1, 'product' => 'Desk'],
['account_id' => 2, 'product' => 'Chair'],
]);
$collection->implode('product', ', ');
// Desk, Chair
Se a coleção contiver simples cadeias de caracteres ou valores numéricos, você deve passar o "glue" como único argumento para o método:
collect([1, 2, 3, 4, 5])->implode('-');
// '1-2-3-4-5'
Você pode passar um closure para o método implode
caso queira formatar os valores sendo unidos.
$collection->implode(function (array $item, int $key) {
return strtoupper($item['product']);
}, ', ');
// DESK, CHAIR
O método intersect
remove de uma coleção os valores que não estão presentes no conjunto ou matriz indicada. A coleção resultante manterá as chaves da coleção inicial:
$collection = collect(['Desk', 'Sofa', 'Chair']);
$intersect = $collection->intersect(['Desk', 'Chair', 'Bookcase']);
$intersect->all();
// [0 => 'Desk', 2 => 'Chair']
::: info NOTA O comportamento deste método é modificado ao usar Coleções do Eloquent. :::
O método intersectAssoc
compara a coleção de origem com outra coleção ou matriz e retorna os pares chave/valor que estão presentes em todas as coleções dadas:
$collection = collect([
'color' => 'red',
'size' => 'M',
'material' => 'cotton'
]);
$intersect = $collection->intersectAssoc([
'color' => 'blue',
'size' => 'M',
'material' => 'polyester'
]);
$intersect->all();
// ['size' => 'M']
O método intersectByKeys
remove quaisquer chaves e respetivos valores da coleção inicial que não se encontrem no array
ou na coleção fornecida:
$collection = collect([
'serial' => 'UX301', 'type' => 'screen', 'year' => 2009,
]);
$intersect = $collection->intersectByKeys([
'reference' => 'UX404', 'type' => 'tab', 'year' => 2011,
]);
$intersect->all();
// ['type' => 'screen', 'year' => 2009]
O método isEmpty
retorna true
se a coleção estiver vazia e false
de outra forma.
collect([])->isEmpty();
// true
O método isNotEmpty
retorna true
se a coleção estiver não está vazia; caso contrário, é devolvido false
:
collect([])->isNotEmpty();
// false
A função join
junta os valores da coleção com uma string. Usando o segundo argumento desta função, você pode especificar a forma como o último elemento deve ser anexado à string:
collect(['a', 'b', 'c'])->join(', '); // 'a, b, c'
collect(['a', 'b', 'c'])->join(', ', ', and '); // 'a, b, and c'
collect(['a', 'b'])->join(', ', ' and '); // 'a and b'
collect(['a'])->join(', ', ' and '); // 'a'
collect([])->join(', ', ' and '); // ''
O método keyBy
chaveia a coleção com base no item fornecido. Se vários itens tiverem o mesmo ítem-chave, apenas o último será inserido na nova coleção:
$collection = collect([
['product_id' => 'prod-100', 'name' => 'Desk'],
['product_id' => 'prod-200', 'name' => 'Chair'],
]);
$keyed = $collection->keyBy('product_id');
$keyed->all();
/*
[
'prod-100' => ['product_id' => 'prod-100', 'name' => 'Desk'],
'prod-200' => ['product_id' => 'prod-200', 'name' => 'Chair'],
]
*/
Você também pode passar um callback para o método. O callback deve retornar o valor para chavear a coleção por:
$keyed = $collection->keyBy(function (array $item, int $key) {
return strtoupper($item['product_id']);
});
$keyed->all();
/*
[
'PROD-100' => ['product_id' => 'prod-100', 'name' => 'Desk'],
'PROD-200' => ['product_id' => 'prod-200', 'name' => 'Chair'],
]
*/
O método keys
retorna todas as chaves da coleção:
$collection = collect([
'prod-100' => ['product_id' => 'prod-100', 'name' => 'Desk'],
'prod-200' => ['product_id' => 'prod-200', 'name' => 'Chair'],
]);
$keys = $collection->keys();
$keys->all();
// ['prod-100', 'prod-200']
O método last
retorna o último elemento na coleção que passa em uma verificação de valor lógico especificada:
collect([1, 2, 3, 4])->last(function (int $value, int $key) {
return $value < 3;
});
// 2
Você também pode chamar o método last
sem argumentos para obter o último elemento da coleção. Se a coleção estiver vazia, será retornado um null
:
collect([1, 2, 3, 4])->last();
// 4
O método lazy
retorna uma nova instância de LazyCollection
do vetor subjacente de itens:
$lazyCollection = collect([1, 2, 3, 4])->lazy();
$lazyCollection::class;
// Illuminate\Support\LazyCollection
$lazyCollection->all();
// [1, 2, 3, 4]
Isto é especialmente útil quando você precisa realizar transformações em uma grande "Collection" que contém muitos itens:
$count = $hugeCollection
->lazy()
->where('country', 'FR')
->where('balance', '>', '100')
->count();
Ao converter uma coleção em uma LazyCollection
, evitamos o alocação de grandes quantidades de memória adicional. Mesmo que a coleção original continue mantendo seus próprios valores na memória, os filtros subseqüentes não irão. Portanto, praticamente não será alocada nenhuma quantidade adicional de memória ao filtrar os resultados da coleção.
O método estático macro
permite adicionar métodos à classe Collection
em tempo de execução. Consulte a documentação sobre extensão de coleções para obter mais informações.
O método estático make
cria uma nova instância de coleção. Consulte o capítulo Criando Coleções.
O método map
irá percorrer a coleção e passar cada valor para o callback fornecido. Você é livre para escolher se deseja modificar os elementos e devolvê-los em uma nova coleção:
$collection = collect([1, 2, 3, 4, 5]);
$multiplied = $collection->map(function (int $item, int $key) {
return $item * 2;
});
$multiplied->all();
// [2, 4, 6, 8, 10]
::: warning ATENÇÃO
Como a maioria dos outros métodos de coleção, map
retorna uma nova instância de coleção; ele não modifica a coleção na qual é chamado. Se você deseja transformar a coleção original, use o método transform
.
:::
O método mapInto()
itera pela coleção, criando uma nova instância da classe especificada passando o valor ao construtor.
class Currency
{
/**
* Crie uma nova instância de moeda.
*/
function __construct(
public string $code
) {}
}
$collection = collect(['USD', 'EUR', 'GBP']);
$currencies = $collection->mapInto(Currency::class);
$currencies->all();
// [Currency('USD'), Currency('EUR'), Currency('GBP')]
O método mapSpread
é executado em uma iteração sobre os valores dos itens da coleção e passa o valor de cada item aninhado para o closure fornecido. Ao retornar do closure, a alteração feita nesse item é incluída na nova coleção:
$collection = collect([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
$chunks = $collection->chunk(2);
$sequence = $chunks->mapSpread(function (int $even, int $odd) {
return $even + $odd;
});
$sequence->all();
// [1, 5, 9, 13, 17]
O método mapToGroups
agrupa os itens da coleção com base no closure fornecido. O closure deve retornar um conjunto associativo que contenha uma única chave/par de valores, formando assim uma nova coleção de valores agrupados:
$collection = collect([
[
'name' => 'John Doe',
'department' => 'Sales',
],
[
'name' => 'Jane Doe',
'department' => 'Sales',
],
[
'name' => 'Johnny Doe',
'department' => 'Marketing',
]
]);
$grouped = $collection->mapToGroups(function (array $item, int $key) {
return [$item['department'] => $item['name']];
});
$grouped->all();
/*
[
'Sales' => ['John Doe', 'Jane Doe'],
'Marketing' => ['Johnny Doe'],
]
*/
$grouped->get('Sales')->all();
// ['John Doe', 'Jane Doe']
O método mapWithKeys
itera na coleção e passa cada valor para o callback especificado. O callback deve retornar um conjunto associado contendo uma única chave/par de valores:
$collection = collect([
[
'name' => 'John',
'department' => 'Sales',
'email' => '[email protected]',
],
[
'name' => 'Jane',
'department' => 'Marketing',
'email' => '[email protected]',
]
]);
$keyed = $collection->mapWithKeys(function (array $item, int $key) {
return [$item['email'] => $item['name']];
});
$keyed->all();
/*
[
'[email protected]' => 'John',
'[email protected]' => 'Jane',
]
*/
O método max
retorna o valor máximo de um determinado parâmetro:
$max = collect([
['foo' => 10],
['foo' => 20]
])->max('foo');
// 20
$max = collect([1, 2, 3, 4, 5])->max();
// 5
O método median
retorna o valor médio (em inglês, median
) de uma chave dada:
$median = collect([
['foo' => 10],
['foo' => 10],
['foo' => 20],
['foo' => 40]
])->median('foo');
// 15
$median = collect([1, 1, 2, 4])->median();
// 1.5
O método merge
une o conjunto ou matriz fornecidos com o conjunto original. Se uma chave de tipo string nos itens fornecidos estiver relacionada com a chave de um item no conjunto original, o valor do item fornecido substituirá o valor correspondente na coleção:
$collection = collect(['product_id' => 1, 'price' => 100]);
$merged = $collection->merge(['price' => 200, 'discount' => false]);
$merged->all();
// ['product_id' => 1, 'price' => 200, 'discount' => false]
Se as chaves do elemento forem numéricas, os valores serão acrescentados ao final da coleção:
$collection = collect(['Desk', 'Chair']);
$merged = $collection->merge(['Bookcase', 'Door']);
$merged->all();
// ['Desk', 'Chair', 'Bookcase', 'Door']
O método mergeRecursive
combina de maneira recursiva o conjunto ou matriz indicados com o conjunto original. Se uma chave de string nos itens forem coincidentes com a chave de string no conjunto original, os valores destas chaves são combinados num array e isto é feito de forma recursiva:
$collection = collect(['product_id' => 1, 'price' => 100]);
$merged = $collection->mergeRecursive([
'product_id' => 2,
'price' => 200,
'discount' => false
]);
$merged->all();
// ['product_id' => [1, 2], 'price' => [100, 200], 'discount' => false]
O método min retorna o valor mínimo de um determinado parâmetro:
$min = collect([['foo' => 10], ['foo' => 20]])->min('foo');
// 10
$min = collect([1, 2, 3, 4, 5])->min();
// 1
O método mode
retorna o valor do mode de uma determinada chave:
$mode = collect([
['foo' => 10],
['foo' => 10],
['foo' => 20],
['foo' => 40]
])->mode('foo');
// [10]
$mode = collect([1, 1, 2, 4])->mode();
// [1]
$mode = collect([1, 1, 2, 2])->mode();
// [1, 2]
O método nth
cria uma nova coleção que consiste em cada n-ésimo elemento:
$collection = collect(['a', 'b', 'c', 'd', 'e', 'f']);
$collection->nth(4);
// ['a', 'e']
É possível, opcionalmente, fornecer um deslocamento inicial como o segundo argumento:
$collection->nth(4, 1);
// ['b', 'f']
O método only
retorna os itens da coleção com as chaves especificadas:
$collection = collect([
'product_id' => 1,
'name' => 'Desk',
'price' => 100,
'discount' => false
]);
$filtered = $collection->only(['product_id', 'name']);
$filtered->all();
// ['product_id' => 1, 'name' => 'Desk']
Para o inverso de only
, consulte o método except.
::: info NOTA O comportamento deste método é modificado ao usar Coleções do Eloquent. :::
O método pad
preenche o array com um valor especificado até que esse tamanho seja atingido. Esse método é parecido com a função PHP array_pad.
Para espaçar para a esquerda, você deve especificar um tamanho negativo. Não ocorrerá espaçamento se o valor absoluto do tamanho for menor ou igual ao comprimento da matriz:
$collection = collect(['A', 'B', 'C']);
$filtered = $collection->pad(5, 0);
$filtered->all();
// ['A', 'B', 'C', 0, 0]
$filtered = $collection->pad(-5, 0);
$filtered->all();
// [0, 0, 'A', 'B', 'C']
O método partition
pode ser combinado com o destruturamento de arrays para separar os elementos que atendem um determinado teste verdadeiro dos que não.
$collection = collect([1, 2, 3, 4, 5, 6]);
[$underThree, $equalOrAboveThree] = $collection->partition(function (int $i) {
return $i < 3;
});
$underThree->all();
// [1, 2]
$equalOrAboveThree->all();
// [3, 4, 5, 6]
O método percentage
pode ser usado para determinar rapidamente o percentual de itens na coleção que atendem a um determinado teste de veracidade.
$collection = collect([1, 1, 2, 2, 2, 3]);
$percentage = $collection->percentage(fn ($value) => $value === 1);
// 33.33
Por padrão, o valor do percentual é arredondado para duas casas decimais. No entanto, você pode personalizar este comportamento ao fornecer um segundo argumento à função:
$percentage = $collection->percentage(fn ($value) => $value === 1, precision: 3);
// 33.333
O método pipe
passa a coleção para o bloco de construção fornecido e retorna o resultado do bloco de construção executado:
$collection = collect([1, 2, 3]);
$piped = $collection->pipe(function (Collection $collection) {
return $collection->sum();
});
// 6
O método pipeInto
cria uma nova instância da classe especificada e passa a coleção para o construtor:
class ResourceCollection
{
/**
* Crie uma nova instância de ResourceCollection.
*/
public function __construct(
public Collection $collection,
) {}
}
$collection = collect([1, 2, 3]);
$resource = $collection->pipeInto(ResourceCollection::class);
$resource->collection->all();
// [1, 2, 3]
O método pipeThrough
passa a coleção para um determinado array de closures e retorna o resultado dos closures executados:
use Illuminate\Support\Collection;
$collection = collect([1, 2, 3]);
$result = $collection->pipeThrough([
function (Collection $collection) {
return $collection->merge([4, 5]);
},
function (Collection $collection) {
return $collection->sum();
},
]);
// 15
O método pluck
recupera todos os valores de um determinado parâmetro:
$collection = collect([
['product_id' => 'prod-100', 'name' => 'Desk'],
['product_id' => 'prod-200', 'name' => 'Chair'],
]);
$plucked = $collection->pluck('name');
$plucked->all();
// ['Desk', 'Chair']
Também é possível especificar como você quer que a coleção seja identificada:
$plucked = $collection->pluck('name', 'product_id');
$plucked->all();
// ['prod-100' => 'Desk', 'prod-200' => 'Chair']
O método pluck
também permite recuperar valores aninhados usando a notação de "ponto":
$collection = collect([
[
'name' => 'Laracon',
'speakers' => [
'first_day' => ['Rosa', 'Judith'],
],
],
[
'name' => 'VueConf',
'speakers' => [
'first_day' => ['Abigail', 'Joey'],
],
],
]);
$plucked = $collection->pluck('speakers.first_day');
$plucked->all();
// [['Rosa', 'Judith'], ['Abigail', 'Joey']]
Se houver chaves duplicadas, o último elemento correspondente será inserido na coleção extraída:
$collection = collect([
['brand' => 'Tesla', 'color' => 'red'],
['brand' => 'Pagani', 'color' => 'white'],
['brand' => 'Tesla', 'color' => 'black'],
['brand' => 'Pagani', 'color' => 'orange'],
]);
$plucked = $collection->pluck('color', 'brand');
$plucked->all();
// ['Tesla' => 'black', 'Pagani' => 'orange']
O método pop
remove e retorna o último item da coleção:
$collection = collect([1, 2, 3, 4, 5]);
$collection->pop();
// 5
$collection->all();
// [1, 2, 3, 4]
Pode ser utilizado um número inteiro na chamada do método pop
para remover e retornar vários itens de uma coleção:
$collection = collect([1, 2, 3, 4, 5]);
$collection->pop(3);
// collect([5, 4, 3])
$collection->all();
// [1, 2]
O método prepend
adiciona um elemento ao início da coleção:
$collection = collect([1, 2, 3, 4, 5]);
$collection->prepend(0);
$collection->all();
// [0, 1, 2, 3, 4, 5]
Você também pode passar um segundo argumento para especificar a chave do item adicionado antes do outro:
$collection = collect(['one' => 1, 'two' => 2]);
$collection->prepend(0, 'zero');
$collection->all();
// ['zero' => 0, 'one' => 1, 'two' => 2]
O método pull
remove e retorna um elemento da coleção pelo seu nome chave:
$collection = collect(['product_id' => 'prod-100', 'name' => 'Desk']);
$collection->pull('name');
// 'Desk'
$collection->all();
// ['product_id' => 'prod-100']
O método push
adiciona um elemento no final da coleção:
$collection = collect([1, 2, 3, 4]);
$collection->push(5);
$collection->all();
// [1, 2, 3, 4, 5]
O método put
define a chave e o valor indicados na coleção:
$collection = collect(['product_id' => 1, 'name' => 'Desk']);
$collection->put('price', 100);
$collection->all();
// ['product_id' => 1, 'name' => 'Desk', 'price' => 100]
O método random
retorna um elemento aleatório da coleção:
$collection = collect([1, 2, 3, 4, 5]);
$collection->random();
// 4 - (recuperado aleatoriamente)
Você pode passar um inteiro para o random
para especificar quantos itens deseja recuperar aleatoriamente. Uma coleção de itens sempre é retornada quando você passa explicitamente o número de itens que deseja receber:
$random = $collection->random(3);
$random->all();
// [2, 4, 5] - (recuperado aleatoriamente)
Se a instância da coleção tiver um número inferior de itens do solicitado, o método random
irá lançar uma InvalidArgumentException
.
O método random
também aceita um closure, que recebe a instância atual da coleção:
use Illuminate\Support\Collection;
$random = $collection->random(fn (Collection $items) => min(10, count($items)));
$random->all();
// [1, 2, 3, 4, 5] - (recuperado aleatoriamente)
O método range
retorna uma coleção que contém inteiros entre o intervalo especificado:
$collection = collect()->range(3, 6);
$collection->all();
// [3, 4, 5, 6]
O método reduce
reduz a coleção para um único valor, passando o resultado de cada iteração na iteração subsequente:
$collection = collect([1, 2, 3]);
$total = $collection->reduce(function (?int $carry, int $item) {
return $carry + $item;
});
// 6
O valor para $carry
na primeira iteração é null
. No entanto, pode especificar o seu valor inicial passando um segundo argumento ao reduce
:
$collection->reduce(function (int $carry, int $item) {
return $carry + $item;
}, 4);
// 10
O método reduce
também passa chaves de array em coleções associativas para o retorno de chamada fornecido:
$collection = collect([
'usd' => 1400,
'gbp' => 1200,
'eur' => 1000,
]);
$ratio = [
'usd' => 1,
'gbp' => 1.37,
'eur' => 1.22,
];
$collection->reduce(function (int $carry, int $value, int $key) use ($ratio) {
return $carry + ($value * $ratio[$key]);
});
// 4264
O método reduceSpread
reduz a coleção a um array de valores, passando os resultados de cada iteração para a iteração subsequente. Este método é semelhante ao método reduce
, no entanto, este pode aceitar vários valores iniciais:
[$creditsRemaining, $batch] = Image::where('status', 'unprocessed')
->get()
->reduceSpread(function (int $creditsRemaining, Collection $batch, Image $image) {
if ($creditsRemaining >= $image->creditsRequired()) {
$batch->push($image);
$creditsRemaining -= $image->creditsRequired();
}
return [$creditsRemaining, $batch];
}, $creditsAvailable, collect());
O método reject
filtra a coleção utilizando o closure especificado. O closure deverá retornar true
se o item deveria ser removido da coleção resultante:
$collection = collect([1, 2, 3, 4]);
$filtered = $collection->reject(function (int $value, int $key) {
return $value > 2;
});
$filtered->all();
// [1, 2]
Para o inverso do método reject
, consulte o método filter
.
O método replace
funciona de forma semelhante ao merge
; no entanto, além de substituir os itens correspondentes que têm chaves de string, o método replace
também substitui os itens na coleção com chaves numéricas:
$collection = collect(['Taylor', 'Abigail', 'James']);
$replaced = $collection->replace([1 => 'Victoria', 3 => 'Finn']);
$replaced->all();
// ['Taylor', 'Victoria', 'James', 'Finn']
Esse método funciona como o replace
, mas ele fará uma substituição em um array, aplicando-a aos valores internos do array:
$collection = collect([
'Taylor',
'Abigail',
[
'James',
'Victoria',
'Finn'
]
]);
$replaced = $collection->replaceRecursive([
'Charlie',
2 => [1 => 'King']
]);
$replaced->all();
// ['Charlie', 'Abigail', ['James', 'King', 'Finn']]
O método reverse
reverte a ordem dos itens da coleção, mantendo as chaves originais:
$collection = collect(['a', 'b', 'c', 'd', 'e']);
$reversed = $collection->reverse();
$reversed->all();
/*
[
4 => 'e',
3 => 'd',
2 => 'c',
1 => 'b',
0 => 'a',
]
*/
O método search
procurará a chave da coleção com o valor indicado e retornará sua chave caso seja encontrada. Caso o elemento não seja encontrado, será retornado false
:
$collection = collect([2, 4, 6, 8]);
$collection->search(4);
// 1
A pesquisa é realizada usando uma comparação "fraca", o que significa que uma string com um valor inteiro será considerado igual a um inteiro com o mesmo valor. Para usar a comparação "rigorosa" (estrita), passe true
como segundo argumento para o método:
collect([2, 4, 6, 8])->search('4', strict: true);
// false
Como alternativa, você pode fornecer sua própria função closure para buscar o primeiro item que passa em um determinado teste de verdade.
collect([2, 4, 6, 8])->search(function (int $item, int $key) {
return $item > 5;
});
// 2
O método select
seleciona as chaves especificadas da coleção, de forma semelhante a uma instrução SELECT
em SQL:
$users = collect([
['name' => 'Taylor Otwell', 'role' => 'Developer', 'status' => 'active'],
['name' => 'Victoria Faith', 'role' => 'Researcher', 'status' => 'active'],
]);
$users->select(['name', 'role']);
/*
[
['name' => 'Taylor Otwell', 'role' => 'Developer'],
['name' => 'Victoria Faith', 'role' => 'Researcher'],
],
*/
O método shift()
remove o primeiro elemento da coleção e devolve-o:
$collection = collect([1, 2, 3, 4, 5]);
$collection->shift();
// 1
$collection->all();
// [2, 3, 4, 5]
Você pode passar um inteiro para o método shift
para remover e retornar vários itens do início de uma coleção:
$collection = collect([1, 2, 3, 4, 5]);
$collection->shift(3);
// collect([1, 2, 3])
$collection->all();
// [4, 5]
O método "shuffle" permite que os itens na coleção sejam emparelhados aleatoriamente.
$collection = collect([1, 2, 3, 4, 5]);
$shuffled = $collection->shuffle();
$shuffled->all();
// [3, 2, 5, 1, 4] - (generated randomly)
O método skip
retorna uma nova coleção com o número especificado de elementos removidos do início da coleção.
$collection = collect([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
$collection = $collection->skip(4);
$collection->all();
// [5, 6, 7, 8, 9, 10]
O método skipUntil
ignora itens da coleção até o retorno de true
, na chamada do callback e em seguida, retorna os itens restantes na coleção como uma nova instância da coleção.
$collection = collect([1, 2, 3, 4]);
$subset = $collection->skipUntil(function (int $item) {
return $item >= 3;
});
$subset->all();
// [3, 4]
Você também pode passar um valor simples ao método skipUntil
, para ignorar todos os itens até encontrar o valor especificado:
$collection = collect([1, 2, 3, 4]);
$subset = $collection->skipUntil(3);
$subset->all();
// [3, 4]
::: warning ATENÇÃO
Se o valor fornecido não estiver presente ou se o recurso de retorno nunca retornar true
, a função skipUntil
irá retornar uma coleção vazia.
:::
O método skipWhile
ignora os itens da coleção enquanto o callback fornecido retornar true
, e em seguida, retorna os itens restantes na coleção como uma nova coleção.
$collection = collect([1, 2, 3, 4]);
$subset = $collection->skipWhile(function (int $item) {
return $item <= 3;
});
$subset->all();
// [4]
::: warning ATENÇÃO
Se o retorno do callback for sempre false
, o método skipWhile
irá devolver uma coleção vazia.
:::
O método slice
retorna um fragmento da coleção que começa no índice especificado:
$collection = collect([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
$slice = $collection->slice(4);
$slice->all();
// [5, 6, 7, 8, 9, 10]
Se quiser limitar o tamanho do trecho de retorno, passe o tamanho desejado como segundo argumento ao método:
$slice = $collection->slice(4, 2);
$slice->all();
// [5, 6]
A faixa retornada preservará os valores por padrão. Se você não desejar preservar as chaves originais, poderá usar o método values
para reorientar suas chaves.
O método sliding()
retorna uma nova coleção de porções representando uma visão em "janela deslizante" dos itens na coleção:
$collection = collect([1, 2, 3, 4, 5]);
$chunks = $collection->sliding(2);
$chunks->toArray();
// [[1, 2], [2, 3], [3, 4], [4, 5]]
Isto é especialmente útil em conjunto com o método eachSpread
:
$transactions->sliding(2)->eachSpread(function (Collection $previous, Collection $current) {
$current->total = $previous->total + $current->amount;
});
Você pode opcionalmente passar um segundo valor de "step", que determina a distância entre o primeiro item de cada chunk:
$collection = collect([1, 2, 3, 4, 5]);
$chunks = $collection->sliding(3, step: 2);
$chunks->toArray();
// [[1, 2, 3], [3, 4, 5]]
O método sole
retorna o primeiro elemento da coleção que passa em uma determinada verificação de validade. Contudo, essa condição é válida apenas para um único elemento:
collect([1, 2, 3, 4])->sole(function (int $value, int $key) {
return $value === 2;
});
// 2
Você também pode passar um par de chave/valor para o método sole
, que retornará o primeiro elemento na coleção que corresponda ao par fornecido, mas apenas se houver exatamente um elemento correspondente:
$collection = collect([
['product' => 'Desk', 'price' => 200],
['product' => 'Chair', 'price' => 100],
]);
$collection->sole('product', 'Chair');
// ['product' => 'Chair', 'price' => 100]
Como alternativa, você pode também chamar o método sole
sem nenhum argumento para obter o primeiro elemento da coleção se houver apenas um elemento.
$collection = collect([
['product' => 'Desk', 'price' => 200],
]);
$collection->sole();
// ['product' => 'Desk', 'price' => 200]
Se não existir nenhum elemento na coleção a ser retornado pelo método sole
, será lançada uma exceção \Illuminate\Collections\ItemNotFoundException
. Se houver mais de um elemento a ser retornado, será lançada uma exceção \Illuminate\Collections\MultipleItemsFoundException
.
Apelido para o método contains
.
O método sort
ordena a coleção. A ordem mantém as chaves da matriz original, então no exemplo seguinte iremos utilizar o método values
para redefinir as chaves como índices numerados consecutivamente:
$collection = collect([5, 3, 1, 2, 4]);
$sorted = $collection->sort();
$sorted->values()->all();
// [1, 2, 3, 4, 5]
Se as suas necessidades de ordenação forem mais avançadas, poderá passar um callback ao sort
com o seu próprio algoritmo. Consulte a documentação do PHP sobre uasort
, que é o que o método sort
da coleção utiliza internamente.
::: info NOTA
Se você precisar classificar uma coleção de arrays ou objetos aninhados, consulte os métodos sortBy
e sortByDesc
.
:::
O método sortBy
ordena a coleção de acordo com a chave fornecida. A coleção ordenada mantém as chaves do array original, portanto, no exemplo seguinte, utilizaremos o método values
para resetar as chaves para índices numerados consecutivamente:
$collection = collect([
['name' => 'Desk', 'price' => 200],
['name' => 'Chair', 'price' => 100],
['name' => 'Bookcase', 'price' => 150],
]);
$sorted = $collection->sortBy('price');
$sorted->values()->all();
/*
[
['name' => 'Chair', 'price' => 100],
['name' => 'Bookcase', 'price' => 150],
['name' => 'Desk', 'price' => 200],
]
*/
O método sortBy
aceita sinalizadores de ordenação como segundo argumento:
$collection = collect([
['title' => 'Item 1'],
['title' => 'Item 12'],
['title' => 'Item 3'],
]);
$sorted = $collection->sortBy('title', SORT_NATURAL);
$sorted->values()->all();
/*
[
['title' => 'Item 1'],
['title' => 'Item 3'],
['title' => 'Item 12'],
]
*/
Como alternativa, você pode fornecer sua própria função de closure para determinar como ordenar os valores da coleção:
$collection = collect([
['name' => 'Desk', 'colors' => ['Black', 'Mahogany']],
['name' => 'Chair', 'colors' => ['Black']],
['name' => 'Bookcase', 'colors' => ['Red', 'Beige', 'Brown']],
]);
$sorted = $collection->sortBy(function (array $product, int $key) {
return count($product['colors']);
});
$sorted->values()->all();
/*
[
['name' => 'Chair', 'colors' => ['Black']],
['name' => 'Desk', 'colors' => ['Black', 'Mahogany']],
['name' => 'Bookcase', 'colors' => ['Red', 'Beige', 'Brown']],
]
*/
Se quiser classificar a sua coleção por vários atributos, poderá passar uma matriz de operações de classificação ao método sortBy
. Cada operação de classificação deve ser um array que inclui o atributo em função do qual se pretende efetuar a classificação e a direção da ordem desejada:
$collection = collect([
['name' => 'Taylor Otwell', 'age' => 34],
['name' => 'Abigail Otwell', 'age' => 30],
['name' => 'Taylor Otwell', 'age' => 36],
['name' => 'Abigail Otwell', 'age' => 32],
]);
$sorted = $collection->sortBy([
['name', 'asc'],
['age', 'desc'],
]);
$sorted->values()->all();
/*
[
['name' => 'Abigail Otwell', 'age' => 32],
['name' => 'Abigail Otwell', 'age' => 30],
['name' => 'Taylor Otwell', 'age' => 36],
['name' => 'Taylor Otwell', 'age' => 34],
]
*/
Ao classificar uma coleção por vários atributos, você também pode fornecer closures que definem cada operação de classificação:
$collection = collect([
['name' => 'Taylor Otwell', 'age' => 34],
['name' => 'Abigail Otwell', 'age' => 30],
['name' => 'Taylor Otwell', 'age' => 36],
['name' => 'Abigail Otwell', 'age' => 32],
]);
$sorted = $collection->sortBy([
fn (array $a, array $b) => $a['name'] <=> $b['name'],
fn (array $a, array $b) => $b['age'] <=> $a['age'],
]);
$sorted->values()->all();
/*
[
['name' => 'Abigail Otwell', 'age' => 32],
['name' => 'Abigail Otwell', 'age' => 30],
['name' => 'Taylor Otwell', 'age' => 36],
['name' => 'Taylor Otwell', 'age' => 34],
]
*/
Este método tem a mesma assinatura que o método sortBy
, mas ordena a coleção no sentido oposto.
Este método ordena a coleção em sentido oposto ao método sort
:
$collection = collect([5, 3, 1, 2, 4]);
$sorted = $collection->sortDesc();
$sorted->values()->all();
// [5, 4, 3, 2, 1]
Ao contrário do sort
, não é possível enviar um closure ao sortDesc
. Em vez disso, deverá utilizar o método sort
e inverter a comparação.
O método sortKeys
classifica a coleção de acordo com os índices do array associação subjacente:
$collection = collect([
'id' => 22345,
'first' => 'John',
'last' => 'Doe',
]);
$sorted = $collection->sortKeys();
$sorted->all();
/*
[
'first' => 'John',
'id' => 22345,
'last' => 'Doe',
]
*/
Este método tem a mesma assinatura que o método sortKeys
, mas ordena a coleção no sentido oposto.
O método sortKeysUsing
ordena a coleção por meio das chaves do array associaativo subjacente usando um callback.
$collection = collect([
'ID' => 22345,
'first' => 'John',
'last' => 'Doe',
]);
$sorted = $collection->sortKeysUsing('strnatcasecmp');
$sorted->all();
/*
[
'first' => 'John',
'ID' => 22345,
'last' => 'Doe',
]
*/
O callback deve ser uma função de comparação que retorne um inteiro inferior, igual ou superior a zero. Consulte a documentação do PHP sobre uksort
para mais informações. O sortKeysUsing
é uma função interna que utiliza essa instrução de comparação PHP.
O método splice
remove e retorna um trecho de itens que começa em uma determinada posição, especificado por um índice:
$collection = collect([1, 2, 3, 4, 5]);
$chunk = $collection->splice(2);
$chunk->all();
// [3, 4, 5]
$collection->all();
// [1, 2]
Você pode passar um segundo argumento para limitar o tamanho da coleção resultante:
$collection = collect([1, 2, 3, 4, 5]);
$chunk = $collection->splice(2, 1);
$chunk->all();
// [3]
$collection->all();
// [1, 2, 4, 5]
Além disso, você pode passar um terceiro argumento contendo os novos itens que substituirão os itens removidos da coleção.
$collection = collect([1, 2, 3, 4, 5]);
$chunk = $collection->splice(2, 1, [10, 11]);
$chunk->all();
// [3]
$collection->all();
// [1, 2, 10, 11, 4, 5]
O método split
divide um conjunto em uma quantidade determinada de grupos:
$collection = collect([1, 2, 3, 4, 5]);
$groups = $collection->split(3);
$groups->all();
// [[1, 2], [3, 4], [5]]
O método splitIn
divide uma coleção em um número especificado de grupos, preenchendo os grupos não finais completamente antes de alocar o restante grupo:
$collection = collect([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
$groups = $collection->splitIn(3);
$groups->all();
// [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10]]
O método sum
retorna a soma de todos os itens na coleção:
collect([1, 2, 3, 4, 5])->sum();
// 15
Se o conjunto de dados incluir matrizes ou objetos aninhados, você deve indicar uma chave para determinar quais valores somar:
$collection = collect([
['name' => 'JavaScript: The Good Parts', 'pages' => 176],
['name' => 'JavaScript: The Definitive Guide', 'pages' => 1096],
]);
$collection->sum('pages');
// 1272
Você também pode passar uma função própria de closure para determinar quais valores da coleção devem ser somados:
$collection = collect([
['name' => 'Chair', 'colors' => ['Black']],
['name' => 'Desk', 'colors' => ['Black', 'Mahogany']],
['name' => 'Bookcase', 'colors' => ['Red', 'Beige', 'Brown']],
]);
$collection->sum(function (array $product) {
return count($product['colors']);
});
// 6
O método take
retorna uma nova coleção com o número especificado de itens:
$collection = collect([0, 1, 2, 3, 4, 5]);
$chunk = $collection->take(3);
$chunk->all();
// [0, 1, 2]
Você também pode passar um inteiro negativo para obter o número especificado de itens do final da coleção.
$collection = collect([0, 1, 2, 3, 4, 5]);
$chunk = $collection->take(-2);
$chunk->all();
// [4, 5]
O método takeUntil
retorna itens na coleção até o sucesso do callback passado:
$collection = collect([1, 2, 3, 4]);
$subset = $collection->takeUntil(function (int $item) {
return $item >= 3;
});
$subset->all();
// [1, 2]
Você também pode passar um valor simples para o método takeUntil
, de forma que os itens sejam retornados até que o valor especificado seja encontrado:
$collection = collect([1, 2, 3, 4]);
$subset = $collection->takeUntil(3);
$subset->all();
// [1, 2]
[AVISO] Se o valor fornecido não for encontrado ou se o callback nunca retornar
true
, a metodologiatakeUntil
devolverá todos os itens na coleção.
O método takeWhile
retorna os itens da coleção até o callback fornecido retornar false
:
$collection = collect([1, 2, 3, 4]);
$subset = $collection->takeWhile(function (int $item) {
return $item < 3;
});
$subset->all();
// [1, 2]
::: warning ATENÇÃO
Se o retorno de chamada nunca retornar false
, o método takeWhile
retornará todos os itens da coleção.
:::
O método tap
passa a coleção para o callback indicado, permitindo-lhe "interferir" na coleção num determinado ponto e efetuar algo com os itens sem afetar a própria coleção. A coleção é então devolvida pelo método tap
:
collect([2, 4, 3, 1, 5])
->sort()
->tap(function (Collection $collection) {
Log::debug('Values after sorting', $collection->values()->all());
})
->shift();
// 1
O método estático times
cria uma nova coleção ao chamar um closure especificado em um número determinado de vezes:
$collection = Collection::times(10, function (int $number) {
return $number * 9;
});
$collection->all();
// [9, 18, 27, 36, 45, 54, 63, 72, 81, 90]
O método toArray
converte a coleção em um simples "array" de PHP. Caso os valores da coleção sejam modelos Eloquent, esses modelos também serão convertidos para arrays:
$collection = collect(['name' => 'Desk', 'price' => 200]);
$collection->toArray();
/*
[
['name' => 'Desk', 'price' => 200],
]
*/
::: warning ATENÇÃO
toArray
também converte todos os objetos aninhados da coleção que são uma instância de Arrayable
em um array. Se você deseja obter o array bruto subjacente à coleção, use o método all
em vez disso.
:::
O método toJSON
converte a coleção em uma cadeia de formato JSON:
$collection = collect(['name' => 'Desk', 'price' => 200]);
$collection->toJson();
// '{"name":"Desk", "price":200}'
O método transform executa a iteração pela coleção e chama o callback especificado com cada item da coleção. Os itens na coleção serão substituídos pelos valores retornados pelo callback:
$collection = collect([1, 2, 3, 4, 5]);
$collection->transform(function (int $item, int $key) {
return $item * 2;
});
$collection->all();
// [2, 4, 6, 8, 10]
::: warning ATENÇÃO
Ao contrário da maioria dos outros métodos de coleção, transform
modifica a própria coleção. Se você deseja criar uma nova coleção, use o método map
.
:::
O método undot
expande uma coleção unidimensional que usa a notação de pontuação ("dot") para uma coleção multidimensional:
$person = collect([
'name.first_name' => 'Marie',
'name.last_name' => 'Valentine',
'address.line_1' => '2992 Eagle Drive',
'address.line_2' => '',
'address.suburb' => 'Detroit',
'address.state' => 'MI',
'address.postcode' => '48219'
]);
$person = $person->undot();
$person->toArray();
/*
[
"name" => [
"first_name" => "Marie",
"last_name" => "Valentine",
],
"address" => [
"line_1" => "2992 Eagle Drive",
"line_2" => "",
"suburb" => "Detroit",
"state" => "MI",
"postcode" => "48219",
],
]
*/
O método union
adiciona o conjunto dado à coleção. Se o conjunto fornecido contiver chaves que estiverem presentes na coleção original, os valores da coleção original serão preferidos:
$collection = collect([1 => ['a'], 2 => ['b']]);
$union = $collection->union([3 => ['c'], 1 => ['d']]);
$union->all();
// [1 => ['a'], 2 => ['b'], 3 => ['c']]
O método unique
retorna todos os itens exclusivos da coleção. A coleção retornada mantém as chaves do array original, então no exemplo a seguir usaremos o método values
para redefinir as chaves para índices numerados consecutivamente:
$collection = collect([1, 1, 2, 2, 3, 4, 2]);
$unique = $collection->unique();
$unique->values()->all();
// [1, 2, 3, 4]
Ao lidar com matrizes ou objetos aninhados, você pode especificar a chave usada para determinar a unicidade:
$collection = collect([
['name' => 'iPhone 6', 'brand' => 'Apple', 'type' => 'phone'],
['name' => 'iPhone 5', 'brand' => 'Apple', 'type' => 'phone'],
['name' => 'Apple Watch', 'brand' => 'Apple', 'type' => 'watch'],
['name' => 'Galaxy S6', 'brand' => 'Samsung', 'type' => 'phone'],
['name' => 'Galaxy Gear', 'brand' => 'Samsung', 'type' => 'watch'],
]);
$unique = $collection->unique('brand');
$unique->values()->all();
/*
[
['name' => 'iPhone 6', 'brand' => 'Apple', 'type' => 'phone'],
['name' => 'Galaxy S6', 'brand' => 'Samsung', 'type' => 'phone'],
]
*/
Por último, você também pode fornecer uma função própria de closure para o método unique
, especificando qual valor deve determinar a exclusividade do item:
$unique = $collection->unique(function (array $item) {
return $item['brand'].$item['type'];
});
$unique->values()->all();
/*
[
['name' => 'iPhone 6', 'brand' => 'Apple', 'type' => 'phone'],
['name' => 'Apple Watch', 'brand' => 'Apple', 'type' => 'watch'],
['name' => 'Galaxy S6', 'brand' => 'Samsung', 'type' => 'phone'],
['name' => 'Galaxy Gear', 'brand' => 'Samsung', 'type' => 'watch'],
]
*/
O método unique
utiliza comparações "fraca", ou seja, uma string com um valor inteiro é considerada igual a um inteiro do mesmo valor. Para filtrar usando comparações "rigorosas", use o método uniqueStrict
.
::: info NOTA O comportamento deste método é modificado ao usar Coleções Eloquent. :::
Esse método tem a mesma assinatura que o método "unique"; no entanto, todos os valores são comparados usando comparações estritas.
O método unless
irá executar o callback fornecido, a menos que o primeiro argumento seja true
:
$collection = collect([1, 2, 3]);
$collection->unless(true, function (Collection $collection) {
return $collection->push(4);
});
$collection->unless(false, function (Collection $collection) {
return $collection->push(5);
});
$collection->all();
// [1, 2, 3, 5]
Pode ser passada uma segunda chamada de retorno para o método unless
. A segunda função é executada quando o primeiro argumento for avaliado como verdadeiro.
$collection = collect([1, 2, 3]);
$collection->unless(true, function (Collection $collection) {
return $collection->push(4);
}, function (Collection $collection) {
return $collection->push(5);
});
$collection->all();
// [1, 2, 3, 5]
Para o inverso de unless
, consulte o método "when".
Nome alternativo para o método whenNotEmpty
.
Apelido para o método whenEmpty
.
O método estático unwrap
retorna os itens subjacentes da coleção do valor dado quando aplicável:
Collection::unwrap(collect('John Doe'));
// ['John Doe']
Collection::unwrap(['John Doe']);
// ['John Doe']
Collection::unwrap('John Doe');
// 'John Doe'
O método value
recupera um determinado valor do primeiro elemento da coleção:
$collection = collect([
['product' => 'Desk', 'price' => 200],
['product' => 'Speaker', 'price' => 400],
]);
$value = $collection->value('price');
// 200
O método values
retorna uma nova coleção com as chaves redefinidas como números inteiros consecutivos:
$collection = collect([
10 => ['product' => 'Desk', 'price' => 200],
11 => ['product' => 'Desk', 'price' => 200],
]);
$values = $collection->values();
$values->all();
/*
[
0 => ['product' => 'Desk', 'price' => 200],
1 => ['product' => 'Desk', 'price' => 200],
]
*/
O método when
irá executar o callback fornecido quando o primeiro argumento for avaliado como true
. A instância da coleção e o primeiro argumento passados ao método when
serão fornecidos para o closure:
$collection = collect([1, 2, 3]);
$collection->when(true, function (Collection $collection, int $value) {
return $collection->push(4);
});
$collection->when(false, function (Collection $collection, int $value) {
return $collection->push(5);
});
$collection->all();
// [1, 2, 3, 4]
Uma segunda chamada de retorno pode ser passada para a função when
. O segundo código de retorno será executado quando o primeiro argumento fornecido à função when
tiver um valor verdadeiro:
$collection = collect([1, 2, 3]);
$collection->when(false, function (Collection $collection, int $value) {
return $collection->push(4);
}, function (Collection $collection) {
return $collection->push(5);
});
$collection->all();
// [1, 2, 3, 5]
Para o inverso do when
(ou seja, quando não), consulte o método "unless".
O método whenEmpty
irá executar o ponto de chamada fornecido quando a coleção estiver vazia:
$collection = collect(['Michael', 'Tom']);
$collection->whenEmpty(function (Collection $collection) {
return $collection->push('Adam');
});
$collection->all();
// ['Michael', 'Tom']
$collection = collect();
$collection->whenEmpty(function (Collection $collection) {
return $collection->push('Adam');
});
$collection->all();
// ['Adam']
Uma segunda ação de closure pode ser passada para o método whenEmpty
, que será executado quando a coleção estiver vazia.
$collection = collect(['Michael', 'Tom']);
$collection->whenEmpty(function (Collection $collection) {
return $collection->push('Adam');
}, function (Collection $collection) {
return $collection->push('Taylor');
});
$collection->all();
// ['Michael', 'Tom', 'Taylor']
Para obter o inverso de whenEmpty
, consulte o método whenNotEmpty
.
O método whenNotEmpty
irá executar o callback dado quando a coleção estiver vazia:
$collection = collect(['michael', 'tom']);
$collection->whenNotEmpty(function (Collection $collection) {
return $collection->push('adam');
});
$collection->all();
// ['michael', 'tom', 'adam']
$collection = collect();
$collection->whenNotEmpty(function (Collection $collection) {
return $collection->push('adam');
});
$collection->all();
// []
Pode ser passado um segundo closure para o método whenNotEmpty
, que será executado quando a coleção estiver vazia:
$collection = collect();
$collection->whenNotEmpty(function (Collection $collection) {
return $collection->push('adam');
}, function (Collection $collection) {
return $collection->push('taylor');
});
$collection->all();
// ['taylor']
Para o inverso de whenNotEmpty
, consulte o método whenEmpty
.
O método where
filtra a coleção por um determinado par de chave/valor:
$collection = collect([
['product' => 'Desk', 'price' => 200],
['product' => 'Chair', 'price' => 100],
['product' => 'Bookcase', 'price' => 150],
['product' => 'Door', 'price' => 100],
]);
$filtered = $collection->where('price', 100);
$filtered->all();
/*
[
['product' => 'Chair', 'price' => 100],
['product' => 'Door', 'price' => 100],
]
*/
O método where
utiliza comparações "relaxadas", o que significa que uma string com um valor inteiro será considerada igual a um inteiro de mesmo valor. Use o método whereStrict
para filtrar com comparações "rigorosas".
Opcionalmente, você pode passar um operador de comparação como segundo parâmetro. Os operadores suportados são: '===', '!==', '!=', '==', '=', '<>', '>', '<', '>=' e ' <=':
$collection = collect([
['name' => 'Jim', 'deleted_at' => '2019-01-01 00:00:00'],
['name' => 'Sally', 'deleted_at' => '2019-01-02 00:00:00'],
['name' => 'Sue', 'deleted_at' => null],
]);
$filtered = $collection->where('deleted_at', '!=', null);
$filtered->all();
/*
[
['name' => 'Jim', 'deleted_at' => '2019-01-01 00:00:00'],
['name' => 'Sally', 'deleted_at' => '2019-01-02 00:00:00'],
]
*/
Este método tem a mesma assinatura que o método "where"; no entanto, todos os valores são comparados usando comparações "estritas".
O método whereBetween
filtra a coleção determinando se o valor do item especificado está dentro de um intervalo dado:
$collection = collect([
['product' => 'Desk', 'price' => 200],
['product' => 'Chair', 'price' => 80],
['product' => 'Bookcase', 'price' => 150],
['product' => 'Pencil', 'price' => 30],
['product' => 'Door', 'price' => 100],
]);
$filtered = $collection->whereBetween('price', [100, 200]);
$filtered->all();
/*
[
['product' => 'Desk', 'price' => 200],
['product' => 'Bookcase', 'price' => 150],
['product' => 'Door', 'price' => 100],
]
*/
O método whereIn
remove os elementos da coleção que não possuem um determinado valor de item contido na matriz especificada:
$collection = collect([
['product' => 'Desk', 'price' => 200],
['product' => 'Chair', 'price' => 100],
['product' => 'Bookcase', 'price' => 150],
['product' => 'Door', 'price' => 100],
]);
$filtered = $collection->whereIn('price', [150, 200]);
$filtered->all();
/*
[
['product' => 'Desk', 'price' => 200],
['product' => 'Bookcase', 'price' => 150],
]
*/
O método whereIn
utiliza comparações "fracas" ao verificar os valores dos itens, o que significa que uma string com um valor inteiro será considerada igual a um inteiro com o mesmo valor. Use o método whereInStrict
para filtrar usando comparações "rigorosas".
Este método possui a mesma assinatura que o método whereIn
; no entanto, todas as comparações são efetuadas usando comparações “rigorosas”.
O método whereInstanceOf
filtra a coleção por um tipo de classe específica:
use App\Models\User;
use App\Models\Post;
$collection = collect([
new User,
new User,
new Post,
]);
$filtered = $collection->whereInstanceOf(User::class);
$filtered->all();
// [App\Models\User, App\Models\User]
O método whereNotBetween
filtra a coleção determinando se o valor do item especificado está fora de um intervalo dado:
$collection = collect([
['product' => 'Desk', 'price' => 200],
['product' => 'Chair', 'price' => 80],
['product' => 'Bookcase', 'price' => 150],
['product' => 'Pencil', 'price' => 30],
['product' => 'Door', 'price' => 100],
]);
$filtered = $collection->whereNotBetween('price', [100, 200]);
$filtered->all();
/*
[
['product' => 'Chair', 'price' => 80],
['product' => 'Pencil', 'price' => 30],
]
*/
O método whereNotIn
remove os elementos da coleção que têm um valor de elemento especificado que está contido no array fornecido:
$collection = collect([
['product' => 'Desk', 'price' => 200],
['product' => 'Chair', 'price' => 100],
['product' => 'Bookcase', 'price' => 150],
['product' => 'Door', 'price' => 100],
]);
$filtered = $collection->whereNotIn('price', [150, 200]);
$filtered->all();
/*
[
['product' => 'Chair', 'price' => 100],
['product' => 'Door', 'price' => 100],
]
*/
O método whereNotIn
usa comparações "fracas" ao verificar os valores dos itens, o que significa que uma string com um valor inteiro será considerada igual a um inteiro com o mesmo valor. Use o método whereNotInStrict
para filtrar usando comparações "rigorosas".
Esse método possui a mesma assinatura que o método whereNotIn
, porém todas as comparações são feitas de maneira estrita (strict).
O método whereNotNull
retorna itens de uma coleção onde a chave indicada não é null
:
$collection = collect([
['name' => 'Desk'],
['name' => null],
['name' => 'Bookcase'],
]);
$filtered = $collection->whereNotNull('name');
$filtered->all();
/*
[
['name' => 'Desk'],
['name' => 'Bookcase'],
]
*/
O método whereNull
retorna itens da coleção em que a chave fornecida é null
:
$collection = collect([
['name' => 'Desk'],
['name' => null],
['name' => 'Bookcase'],
]);
$filtered = $collection->whereNull('name');
$filtered->all();
/*
[
['name' => null],
]
*/
O método estático wrap
envolve o valor dado em uma coleção quando aplicável:
use Illuminate\Support\Collection;
$collection = Collection::wrap('John Doe');
$collection->all();
// ['John Doe']
$collection = Collection::wrap(['John Doe']);
$collection->all();
// ['John Doe']
$collection = Collection::wrap(collect('John Doe'));
$collection->all();
// ['John Doe']
O método zip
combina os valores do array fornecido com os valores da coleção original no mesmo índice:
$collection = collect(['Chair', 'Desk']);
$zipped = $collection->zip([100, 200]);
$zipped->all();
// [['Chair', 100], ['Desk', 200]]
As coleções também fornecem suporte para mensagens de "ordem superior", que são atalhos para a execução de ações comuns nas coleções. Os métodos de coleção que fornecem mensagens de ordem superior são: average
, avg
, contains
, each
, every
, filter
, first
, flatMap
, groupBy
, keyBy
, map
, max
, min
, partition
, reject
, skipUntil
, skipWhile
, some
, sortBy
, sortByDesc
, sum
, takeUntil
, takeWhile
e unique
.
Cada mensagem de ordem superior pode ser obtida como uma propriedade dinâmica de uma instância da coleção. Por exemplo, para utilizar a mensagem de ordem superior each
é possível chamar uma função em cada objeto dentro da coleção:
use App\Models\User;
$users = User::where('votes', '>', 500)->get();
$users->each->markAsVip();
Do mesmo modo, podemos usar a mensagem de segunda ordem sum
para obter o número total de "votos" num conjunto de utilizadores:
$users = User::where('group', 'Development')->get();
return $users->sum->votes;
::: warning ATENÇÃO Antes de aprender mais sobre as coleções lentas do Laravel, reserve um tempo para se familiarizar com os geradores PHP. :::
Para suplementar a poderosa classe Collection
, a classe LazyCollection
aproveita os geradores do PHP para permitir que você trabalhe com conjuntos de dados muito grandes mantendo o uso da memória baixo.
Por exemplo, imagine que o seu aplicativo tenha de processar um ficheiro de registro de vários gigabytes, aproveitando para analisá-lo com os métodos de coleção do Laravel. Em vez de ler todo o arquivo na memória de uma só vez, pode ser utilizada a capacidade de criação de coleções "lazy" que mantêm apenas uma pequena parte do ficheiro na memória numa determinada altura:
use App\Models\LogEntry;
use Illuminate\Support\LazyCollection;
LazyCollection::make(function () {
$handle = fopen('log.txt', 'r');
while (($line = fgets($handle)) !== false) {
yield $line;
}
})->chunk(4)->map(function (array $lines) {
return LogEntry::fromLines($lines);
})->each(function (LogEntry $logEntry) {
// Processar a entrada de registro...
});
Ou, imagine que você precise iterar através de 10.000 modelos Eloquent. Quando usamos coleções tradicionais do Laravel, todos os 10.000 modelos Eloquent devem ser carregados na memória ao mesmo tempo:
use App\Models\User;
$users = User::all()->filter(function (User $user) {
return $user->id > 500;
});
No entanto, o método cursor do construtor de consultas retorna uma instância de LazyCollection
. Isto permite-lhe realizar apenas uma única consulta contra o banco de dados, bem como manter apenas um modelo Eloquent em memória por vez. Neste exemplo, a função de callback filter
não é executada até iterarmos individualmente sobre cada utilizador, permitindo uma redução drástica do uso de memória:
use App\Models\User;
$users = User::cursor()->filter(function (User $user) {
return $user->id > 500;
});
foreach ($users as $user) {
echo $user->id;
}
Para criar uma instância de coleção "lazy" (ativa somente quando necessária), deve ser fornecida uma função geradora PHP na metodologia make
da coleção:
use Illuminate\Support\LazyCollection;
LazyCollection::make(function () {
$handle = fopen('log.txt', 'r');
while (($line = fgets($handle)) !== false) {
yield $line;
}
});
Quase todos os métodos disponíveis na classe Collection
também estão disponíveis na classe LazyCollection
. Ambas as classes implementam o contrato Illuminate\Support\Enumerable
que define os seguintes métodos:
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
::: warning ATENÇÃO
Os métodos que modificam a coleção (como shift
, pop
, prepend
etc.) não estão disponíveis na classe LazyCollection
.
:::
Além dos métodos definidos no contrato Enumerable
, a classe LazyCollection
inclui os seguintes métodos:
O método takeUntilTimeout
retorna uma nova coleção lenta que irá enumerar os valores até o tempo especificado. Depois desse tempo, a coleção deverá parar de ser enumerada:
$lazyCollection = LazyCollection::times(INF)
->takeUntilTimeout(now()->addMinute());
$lazyCollection->each(function (int $number) {
dump($number);
sleep(1);
});
// 1
// 2
// ...
// 58
// 59
Para ilustrar o uso desse método, imagine um aplicativo que envia faturas da base de dados usando um cursor. É possível definir uma tarefa agendada que é executada a cada 15 minutos e processa apenas faturas por até 14 minutos:
use App\Models\Invoice;
use Illuminate\Support\Carbon;
Invoice::pending()->cursor()
->takeUntilTimeout(
Carbon::createFromTimestamp(LARAVEL_START)->add(14, 'minutes')
)
->each(fn (Invoice $invoice) => $invoice->submit());
Enquanto o método each
chama o callback indicado para cada item da coleção de uma só vez, o método tapEach
somente chama o callback especificado quando os itens estão sendo retirados da lista um a um:
// Nada foi descartado até agora...
$lazyCollection = LazyCollection::times(INF)->tapEach(function (int $value) {
dump($value);
});
// Três itens foram descartados...
$array = $lazyCollection->take(3)->all();
// 1
// 2
// 3
O método throttle
reduzirá a velocidade da coleção lenta de tal forma que cada valor será retornado após o período especificado em segundos. Esse método é especialmente útil para situações onde você possa estar interagindo com APIs externas, que limitem as solicitações recebidas:
use App\Models\User;
User::where('vip', true)
->cursor()
->throttle(seconds: 1)
->each(function (User $user) {
// Chamar API externa...
});
O método remember
retorna uma nova coleção lazy que recordará quaisquer valores já enumerados e não os recupera novamente nas subsequentes enumerações da coleção:
// Nenhuma consulta foi executada ainda...
$users = User::cursor()->remember();
// A consulta é executada...
// Os primeiros 5 usuários são hidratados do banco de dados...
$users->take(5)->all();
// Os primeiros 5 usuários vêm do cache da coleção...
// O restante é hidratado do banco de dados...
$users->take(20)->all();