Buscar..


Sintaxis

  • $ collection = collect (['Value1', 'Value2', 'Value3']); // Las teclas predeterminadas son 0, 1, 2, ...,

Observaciones

Illuminate\Support\Collection proporciona una interfaz fluida y conveniente para tratar con matrices de datos. Puede que los haya utilizado sin saberlo, por ejemplo, las consultas de modelos que recuperan varios registros devuelven una instancia de Illuminate\Support\Collection .

Para obtener documentación actualizada sobre Colecciones, puede encontrar la documentación oficial aquí.

Creando Colecciones

Al usar el ayudante de collect() , puede crear fácilmente nuevas instancias de colección pasando una matriz como:

$fruits = collect(['oranges', 'peaches', 'pears']);

Si no desea usar las funciones de ayuda, puede crear una nueva Colección utilizando la clase directamente:

$fruits = new Illuminate\Support\Collection(['oranges', 'peaches', 'pears']);

Como se mencionó en los comentarios, los Modelos devuelven por defecto una instancia de Collection , sin embargo, usted es libre de crear sus propias colecciones según sea necesario. Si no se especifica ninguna matriz en la creación, se creará una Colección vacía.

dónde()

Puede seleccionar ciertos elementos de una colección utilizando el método where() .

$data = [
    ['name' => 'Taylor',  'coffee_drinker' => true],
    ['name' => 'Matt', 'coffee_drinker' => true]
];

$matt = collect($data)->where('name', 'Matt');

Este bit de código seleccionará todos los elementos de la colección donde el nombre es 'Matt'. En este caso, solo se devuelve el segundo artículo.

Anidamiento

Al igual que la mayoría de los métodos de matriz en Laravel, where() admite la búsqueda de elementos anidados. Extendamos el ejemplo anterior agregando una segunda matriz:

$data = [
    ['name' => 'Taylor',  'coffee_drinker' => ['at_work' => true, 'at_home' => true]],
    ['name' => 'Matt', 'coffee_drinker' => ['at_work' => true, 'at_home' => false]]
];

$coffeeDrinkerAtHome = collect($data)->where('coffee_drinker.at_home', true);

Esto solo lo devolverá Taylor, mientras él toma café en casa. Como puede ver, el anidamiento se admite mediante la notación de puntos.

Adiciones

Al crear una colección de objetos en lugar de matrices, estos también se pueden filtrar usando where() también. La Colección intentará recibir todas las propiedades deseadas.

5.3

Tenga en cuenta que, desde Laravel 5.3, el método where() intentará comparar los valores de forma predeterminada. Eso significa que al buscar (int)1 , todas las entradas que contengan '1' también se devolverán. Si no te gusta ese comportamiento, puedes usar el método whereStrict() .

Usando Obtener valor de búsqueda o Devolver predeterminado

A menudo se encuentra en una situación en la que necesita encontrar un valor correspondiente a las variables, y las colecciones lo cubrieron.

En el siguiente ejemplo, tenemos tres configuraciones regionales diferentes en una matriz con un código de llamada correspondiente asignado. Queremos poder proporcionar una configuración regional y, a cambio, obtener el código de llamada asociado. El segundo parámetro en get es un parámetro predeterminado si no se encuentra el primer parámetro.

function lookupCallingCode($locale)
{
    return collect([
        'de_DE' => 49,
        'en_GB' => 44,
        'en_US' => 1,
    ])->get($locale, 44);
}

En el ejemplo anterior podemos hacer lo siguiente

lookupCallingCode('de_DE'); // Will return 49
lookupCallingCode('sv_SE'); // Will return 44

Incluso puede pasar una devolución de llamada como el valor predeterminado. El resultado de la devolución de llamada se devolverá si la clave especificada no existe:

    return collect([
        'de_DE' => 49,
        'en_GB' => 44,
        'en_US' => 1,
    ])->get($locale, function() {
        return 44;
    });

Usando Contiene para verificar si una colección cumple cierta condición

Un problema común es tener una colección de elementos que todos deben cumplir con ciertos criterios. En el siguiente ejemplo, hemos recopilado dos artículos para un plan de dieta y queremos verificar que la dieta no contenga ningún alimento no saludable.

// First we create a collection
$diet = collect([
    ['name' => 'Banana', 'calories' => '89'],
    ['name' => 'Chocolate', 'calories' => '546']
]);

// Then we check the collection for items with more than 100 calories
$isUnhealthy = $diet->contains(function ($i, $snack) {
    return $snack["calories"] >= 100;
});

En el caso anterior, la variable $isUnhealthy se establecerá en true cuando el Chocolate cumpla con la condición, y la dieta no sea saludable.

Usando Pluck para extraer ciertos valores de una colección

A menudo se encontrará con una colección de datos en los que solo está interesado en partes de los datos.

En el siguiente ejemplo, obtuvimos una lista de participantes en un evento y queremos proporcionarle a la guía turística una lista simple de nombres.

// First we collect the participants
$participants = collect([
    ['name' => 'John', 'age' => 55],
    ['name' => 'Melissa', 'age' => 18],
    ['name' => 'Bob', 'age' => 43],
    ['name' => 'Sara', 'age' => 18],
]);

// Then we ask the collection to fetch all the names
$namesList = $partcipants->pluck('name')
// ['John', 'Melissa', 'Bob', 'Sara'];

También puede usar el pluck para colecciones de objetos o matrices / objetos anidados con notación de puntos.

$users = User::all(); // Returns Eloquent Collection of all users
$usernames = $users->pluck('username'); // Collection contains only user names

$users->load('profile'); // Load a relationship for all models in collection

// Using dot notation, we can traverse nested properties
$names = $users->pluck('profile.first_name'); // Get all first names from all user profiles

Usando Map para manipular cada elemento en una colección

A menudo es necesario cambiar la forma en que se estructura un conjunto de datos y manipular ciertos valores.

En el siguiente ejemplo, tenemos una colección de libros con un descuento adjunto. Pero preferimos tener una lista de libros con un precio que ya está descontado.

$books = [
    ['title' => 'The Pragmatic Programmer', 'price' => 20, 'discount' => 0.5],
    ['title' => 'Continuous Delivery', 'price' => 25, 'discount' => 0.1],
    ['title' => 'The Clean Coder', 'price' => 10, 'discount' => 0.75],
];

$discountedItems =  collect($books)->map(function ($book) {
   return ['title' => $book["title"], 'price' => $book["price"] * $book["discount"]];
});

//[
//    ['title' => 'The Pragmatic Programmer', 'price' => 10],
//    ['title' => 'Continuous Delivery', 'price' => 12.5],
//    ['title' => 'The Clean Coder', 'price' => 5],
//]

Esto también podría usarse para cambiar las claves, digamos que queremos cambiar el title la clave para name esta sería una solución adecuada.

Uso de sum, avg, min o max en una colección para cálculos estadísticos

Las colecciones también le proporcionan una manera fácil de hacer cálculos estadísticos simples.

$books = [
    ['title' => 'The Pragmatic Programmer', 'price' => 20],
    ['title' => 'Continuous Delivery', 'price' => 30],
    ['title' => 'The Clean Coder', 'price' => 10],
]

$min = collect($books)->min('price'); // 10
$max = collect($books)->max('price'); // 30
$avg = collect($books)->avg('price'); // 20
$sum = collect($books)->sum('price'); // 60

Ordenar una colección

Hay varias maneras diferentes de clasificar una colección.

Ordenar()

El método de sort ordena la colección:

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

$sorted = $collection->sort();

echo $sorted->values()->all();

returns : [1, 2, 3, 4, 5]

El método de sort también permite pasar una devolución de llamada personalizada con su propio algoritmo. Bajo el capó de tipo usa el usort de php.

$collection = $collection->sort(function ($a, $b) {
    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;
});

Ordenar por()

El método sortBy ordena la colección por la clave dada:

$collection = collect([
['name' => 'Desk', 'price' => 200],
['name' => 'Chair', 'price' => 100],
['name' => 'Bookcase', 'price' => 150],
]);

$sorted = $collection->sortBy('price');

echo $sorted->values()->all();

returns:  [
        ['name' => 'Chair', 'price' => 100],
        ['name' => 'Bookcase', 'price' => 150],
        ['name' => 'Desk', 'price' => 200],
    ]

El método sortBy permite usar el formato de notación de puntos para acceder a una clave más profunda con el fin de ordenar una matriz multidimensional.

$collection = collect([
    ["id"=>1,"product"=>['name' => 'Desk', 'price' => 200]],
    ["id"=>2, "product"=>['name' => 'Chair', 'price' => 100]],
    ["id"=>3, "product"=>['name' => 'Bookcase', 'price' => 150]],
    ]);

$sorted = $collection->sortBy("product.price")->toArray();

return: [
  ["id"=>2, "product"=>['name' => 'Chair', 'price' => 100]],
  ["id"=>3, "product"=>['name' => 'Bookcase', 'price' => 150]],
  ["id"=>1,"product"=>['name' => 'Desk', 'price' => 200]],
]

SortByDesc ()

Este método tiene la misma firma que el método sortBy , pero ordenará la colección en el orden opuesto.

Utilizando reducir ()

El método de reduce reduce la recopilación a un solo valor, pasando el resultado de cada iteración a la iteración posterior. Por favor vea el método de reducción .

El método de reduce recorre cada elemento con una colección y produce un nuevo resultado para la siguiente iteración. Cada resultado de la última iteración se pasa a través del primer parámetro (en los siguientes ejemplos, como $carry ).

Este método puede hacer mucho procesamiento en grandes conjuntos de datos. Por ejemplo, en los siguientes ejemplos, usaremos los siguientes datos de estudiantes de ejemplo:

 $student = [
    ['class' => 'Math', 'score' => 60],
    ['class' => 'English', 'score' => 61],
    ['class' => 'Chemistry', 'score' => 50],
    ['class' => 'Physics', 'score' => 49],
];

Puntuación total del alumno

$sum = collect($student)
    ->reduce(function($carry, $item){
        return $carry + $item["score"];
    }, 0);

Resultado: 220

Explicación:

  • $carry es el resultado de la última iteración.
  • El segundo parámetro es el valor predeterminado para $ carry en la primera ronda de iteración. En este caso, el valor predeterminado es 0.

Pasar un estudiante si todas sus calificaciones son> = 50

$isPass = collect($student)
    ->reduce(function($carry, $item){
        return $carry && $item["score"] >= 50;
    }, true);

Resultado: false

Explicación:

  • El valor predeterminado de $ carry es verdadero
  • Si toda la puntuación es mayor que 50, el resultado devolverá verdadero; Si hay menos de 50, devuelve falso.

Reprobar a un estudiante si cualquier puntaje es <50

$isFail = collect($student)
    ->reduce(function($carry, $item){
        return $carry || $item["score"] < 50;
    }, false);

Resultado: true

Explique:

  • el valor predeterminado de $ carry es falso
  • si cualquier puntaje es menor a 50, devuelva verdadero; Si todas las puntuaciones son mayores que 50, devuelva falso.

Devuelve el tema con la puntuación más alta.

$highestSubject = collect($student)
    ->reduce(function($carry, $item){
        return $carry === null || $item["score"] > $carry["score"] ? $item : $carry;
    });

resultado: [ "subject" => "English", "score" => 61 ]

Explique:

  • El segundo parámetro no se proporciona en este caso.

  • El valor predeterminado de $ carry es nulo, por lo tanto, lo verificamos en nuestro condicional.

Usando macro () para extender colecciones

La función macro() permite agregar una nueva funcionalidad a Illuminate\Support\Collection objetos

Uso:

Collection::macro("macro_name", function ($parameters) {
    // Your macro
});

Por ejemplo:

Collection::macro('uppercase', function () {
    return $this->map(function ($item) {
        return strtoupper($item);
    });
});

collect(["hello", "world"])->uppercase();

Resultado: ["HELLO", "WORLD"]

Usando Sintaxis de Array

El Collection objeto implementa la ArrayAccess y IteratorAggregate interfaz, lo que permite que sea utilizado como una matriz.

Acceder al elemento de recogida:

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

Resultado: 2

Asignar nuevo elemento:

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

Resultado: $collection es [1, 2, 3, 4]

Colección de bucles:

$collection = collect(["a" => "one", "b" => "two"]);
$result = "";
foreach($collection as $key => $value){
    $result .= "(".$key.": ".$value.") ";        
}

Resultado: $result es (a: one) (b: two)

Array a la conversión de la colección:

Para convertir una colección a una matriz nativa de PHP, use:

$array = $collection->all();
//or
$array = $collection->toArray()

Para convertir una matriz en una colección, use:

$collection = collect($array);

Uso de colecciones con funciones de matriz

Tenga en cuenta que las colecciones son objetos normales que no se convertirán correctamente cuando sean utilizadas por funciones que requieren explícitamente arreglos, como array_map($callback) .

Asegúrese de convertir la colección primero o, si está disponible, use el método proporcionado por la clase Collection lugar: $collection->map($callback)



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow