Tomemos una aventura en un tutorial de colecciones de Laravel. Después de haber usado el marco de Laravel durante algún tiempo, me he acostumbrado a trabajar con sus diversas características. Una de las cosas en las que he querido profundizar es el aspecto de Colecciones de Laravel. Estarás lidiando con colecciones de laravel todo el tiempo, y hasta este punto, tal vez seas como yo y descubras lo que necesitabas a medida que avanzaste. ¡No más! Ahora nos convertiremos en maestros profesionales de Laravel Collection al sumergirnos en profundidad, hacer doble clic, profundizar o cualquier otra frase de moda que le gustaría usar en Laravel Collections.


La clase de colección

Antes incluso de comenzar a ver todos los métodos que podemos usar, veamos el archivo de clase en síPodemos ver que tiene todas estas declaraciones de uso en la parte superior.

Entonces, ¿qué significan todos estos y de dónde vienen? Bueno, vamos a atacarlos uno por uno. Primero, tenemos use Countable;Con PHP Storm, podemos usar la práctica herramienta "Ir a la declaración" para ver.

usar contable

Esto nos lleva SPL.phpy nos muestra la Countableinterfaz.

interfaz contable

¡Muy genial! Podemos ver que la interfaz Contable es parte de la Biblioteca PHP estándar (SPL) . Al utilizar esta técnica, podemos descifrar todas estas declaraciones de uso.


Biblioteca PHP estándar

utilizar Contable

usar ArrayIterator

usar CachingIterator

use InvalidArgumentException


Extensión PHP JSON

utilizar JsonSerializable


Interfaces y clases predefinidas de PHP

utilizar ArrayAccess

utilizar IteratorAggregate


Iluminar la interfaz de contratos

use Illuminate \ Contracts \ Support \ Jsonable

use Illuminate \ Contracts \ Support \ Arrayable

También tenga en cuenta que la clase Collection vive en el espacio de nombres Illuminate \ Support Genial, sacamos las cosas administrativas del camino y sabemos lo que significa.


Probar los ejemplos de Laravel

La documentación de Laravel es fantástica y la usaremos como guía para este tutorial de colecciones. Al leer los documentos, podemos ver que para crear una colección, podemos usar el collectayudante conveniente para hacerlo. Ahora que no soy tan bueno para aceptar que las cosas simplemente funcionan, cuando no sé cómo funcionan, incluso debo indagar en cómo funciona este ayudante. Si nos ponemos nuestra gorra de detective, podemos ver que viene directamente de este código aquí .

El helpers.phparchivo tiene una use Illuminate\Support\Collection;declaración en la parte superior, por lo que nuestra función auxiliar puede crear una nueva Collectionpara nosotros usando este fragmento.

Nueva colección

Con nuestro nuevo conocimiento de esta conveniente función de ayuda, permítanos crear una Colección Laravel para divertirnos y obtener ganancias.

Como puede ver, ahora tenemos una colección con la que podemos trabajar. Una de las primeras cosas que se explicarán en la documentación es cómo mapear cada elemento de la colección y aplicarle una función mientras se rechazan los valores que no especifican un criterio determinado. Usando este ejemplo, echemos un vistazo a nuestra propia colección de sitios. Cambiaremos el formato de todas las URL para incluir un prefijo www mientras eliminamos cualquier URL que contenga la palabra facebook. Vamos a intentarlo.

¡Frio! Tenga en cuenta que en esta iteración, hacemos uso de la interfaz fluida. ¿Qué significa ser fluido? Todo lo que significa es que puede encadenar comandos para obtener el resultado deseado. Es como encadenar métodos en jQuery. Aplicamos dos métodos a la colección para lograr nuestro resultado deseado. mapa y rechazo . Dentro de lamapiteración, aplicamos lastr_replacefunción a cada elemento de la colección, eliminando http: // y reemplazándolo por http: // www. Durante larejectiteración usamos el método auxiliar de Laravel str_contains para filtrar cualquier elemento que contenga la palabra facebookTenga en cuenta que la expresión debe ser igual a verdadera para que el rejectmétodo elimine el elemento. Así que casi podemos leer esto como, si la cadena contiene facebook, entonces lo rechazamos. Podemos ver en la captura de pantalla anterior que obtuvimos el resultado deseado.


Los métodos de colección de Laravel

Con una comprensión básica de lo que es una colección de Laravel, veamos ahora todos los métodos disponibles uno por uno.


1. todos ()

La clase Collection tiene una propiedad protegida denominada $itemsque contiene una matriz. De esto se construye la Colección. El all()método simplemente devuelve esa propiedad. Esto es útil si desea cambiar una colección de Laravel en una matriz PHP nativa.

Al probar esto en nuestra propia pequeña colección, podemos ver que se nos devuelve la matriz en la que se basa la colección.


2. avg ()

El avgmétodo hace exactamente lo que crees que haría, calcula el promedio de una colección. Aquí está el código que lo impulsa.

Podemos hacer uso de él en una colección estrictamente numérica como tal.

También puede proporcionar una clave a la que aplicar el promedio. En el ejemplo de una matriz asociativa, necesitaría hacer esto.

La visita promedio de Starbucks le costará $ 3.56.


3. trozo ()

Nunca encontré mucho uso para chunk hasta que leí la documentación, que tiene un gran caso de uso. Como era de esperar, chunk toma un grupo de cosas y lo divide en grupos más pequeños. El caso de uso que menciona la documentación trata con una cuadrícula de Bootstrap, por ejemplo. Si alguna vez ha tenido una cuadrícula llena de elementos y se encuentra recorriendo un conjunto de resultados y luego verificando el valor de un iterador para determinar dónde terminar una fila, ¡este es para usted! De hecho, este es para mí, ¡ya que hago esto todo el tiempo! En lugar de preocuparse por esto, simplemente use chunk () en su lugar. Así es como funciona.

Tenga en cuenta el uso de la función PHP array_chunk () .

Probarlo por nosotros mismos produce estos resultados.

Al recorrer los resultados fragmentados, tenga en cuenta que necesitará un foreach anidado ya que ahora tiene una colección de colecciones más pequeñas. Por lo tanto, debe recorrer cada fragmento y luego recorrer el contenido de cada fragmento individualmente.


4. colapso ()

Este método hace uso de una llamada a un método estático como vemos aquí.

El código al que hace referencia está aquí.

Tome nota especial de la función PHP array_merge () .

Aquí está nuestra pequeña prueba rápida del colapso.

Antes del colapso.

Después del colapso.


5. contiene ()

¿Cuántas veces necesita verificar si una matriz contiene un valor? Todo el tiempo, ¿verdad? El práctico método contains en Laravel Collections hace que sea fácil de hacer cuando se trabaja con una matriz que ha sido recopilada.

El contiene código.

En primer lugar, podemos ver que el código hace uso del PHP nativo func_get_args () . El método data_get () es un método auxiliar personalizado en el marco de trabajo illuminate. Finalmente, podemos ver que in_array () se pone en uso. Visite cada uno de los enlaces anteriores uno por uno para asegurarse de que comprende cada paso del proceso.

Probar contiene () con la siguiente colección.

Parece que el método contiene solo verifica el valor, no la clave de la colección.

Al pasar una cadena vacía como segundo parámetro, puede verificar la existencia de una clave específica.

Puede pasar dos parámetros de manera sensible a mayúsculas y minúsculas para verificar la existencia de un par clave-valor. Tenga en cuenta que esto solo se aplica a las colecciones anidadas, por lo que el fragmento anterior funciona, pero el fragmento siguiente no.

Para ser un poco más granular, puede hacer uso de su propia función de devolución de llamada. Echale un vistazo.

No hay ninguna clave con el nombre de hiphop en nuestra colección. Sin embargo, tenemos un valor NSX en la colección, de ahí el retorno de verdad. Esto también nos permite buscar un par clave-valor en una colección plana como esta.


6. contar ()

Simple pero útil, contar hace exactamente lo que dice, cuenta la cantidad de elementos de la colección. ¿Como funciona? Como así.

El método usa la función nativa de PHP count () . Entonces, en la clase Colección Laravel, simplemente miramos la propiedad $ items y devolvemos la cantidad de elementos que contiene. Observa nuestro ejemplo.


7. diff ()

Este método hace uso de array_diff () para comparar matrices. Este es el código que lo hace funcionar.

Por ejemplo, imagine que un candidato tiene una variedad de empresas para las que le gustaría trabajar. Ella necesita comparar esto con una variedad de empresas que actualmente no están contratando, luego tratar de entrevistar solo a aquellas que están contratando. ¿Cómo podría hacer esto?


8. cada uno ()

Este método le permite aplicar una devolución de llamada a cada elemento de la colección y se alimenta con este código.

Por ejemplo, tendremos una colección de números. Siempre que el número sea menor que 5, usaremos una devolución de llamada para cuadrarlo.

El mismo resultado con un foreach se llevaría a cabo así:

Ya ve, each()solo agregue un poco de azúcar para que pueda codificar en un estilo más moderno si lo prefiere. Elige tu veneno.


9. cada ()

Este método interesante se asoma a su colección y crea una nueva colección en cada enésimo elemento que especifique. La fuente está aquí.

A medida que probamos todos los métodos, podemos ver cómo funciona.

Al pasar un desplazamiento, podemos cambiar el punto de partida para contar.


10. filtro ()

El método de filtro es otro que le permite aplicar una devolución de llamada a la colección, reteniendo solo los elementos que pasan una prueba de su elección. El código que lo hace posible está aquí.

Como podemos ver, hace uso de la función nativa de PHP array_filter () . Tomar el método de filtro para una prueba de manejo nos da estos resultados.

Aquí, básicamente decimos, solo devuelve los elementos que contienen la cadena de 'limón', y de hecho esto es exactamente lo que obtenemos.


11. primero ()

El método first () devuelve el primer elemento de la colección. El código fuente de este método está aquí.

Un ejemplo de first () en acción.

Como podemos ver en este ejemplo, se nos devuelve el primer elemento de la colección que es una matriz. Este método también le permite especificar una condición o prueba de verdad para que pueda devolver el primer elemento que pasa esa prueba. En el siguiente fragmento, comprobaremos si un elemento es una cadena y, de ser así, lo devolveremos.


12. aplanar ()

Si tiene una matriz multidimensional muy anidada, puede usar flatten () para convertirla en una matriz de una sola dimensión. Considere esta colección.

Antes de aplanar ()

Después de aplanar ()

Aquí está el código, que hace uso de una llamada a un método estático.

Tenga en cuenta el uso de la función nativa de PHP array_walk_recursive () .


13. voltear ()

flip () se usa para tomar las claves de una colección e intercambiarlas con sus valores asociados. Veamos qué sucede si intentamos cambiar nuestra colección anterior.

Vemos que esto solo puede operar en valores enteros o de cadena, así que demos una oportunidad a ambos.

Ahora estamos en el negocio, está funcionando como un campeón.

Este método, por supuesto, hace uso de array_flip () y el código que nos muestra esto está aquí.


14. olvidar ()

Con este método puedes Fuhgettaboutit, pronunciado (Fuh-Get-About-It). Pasas la clave del elemento a eliminar y lo hace.

Examinar cómo funciona este método nos muestra este código aquí.

Que hace uso de unset como vemos aquí.


15. forPage ()

Este método interesante hace uso de array_slice () como podemos ver haciendo un trabajo de detective en el archivo de clase Collection a continuación.

Lo que hace es muy bueno. En un conjunto de resultados grande que puede paginarse, puede recuperar los elementos de cualquier página de los resultados. Supongamos que tiene 5 páginas de 5 elementos cada una. Puede especificar que solo desea los resultados que aparecerían en la página 3. Veamos cómo hacerlo.

¡Muy genial!


16. obtener ()

Este es uno de esos métodos que ha estado usando todo este tiempo sin siquiera pensarlo. get () simplemente obtiene el elemento que especifica por clave y devuelve nulo si la clave no está allí. Se alimenta a través del siguiente código fuente y hace uso de la función nativa PHP array_key_exists () .

Considere el ejemplo anterior donde teníamos una lista de 25 URL. La colección constaba de una matriz o matrices. Cada matriz interna usa 'url' como clave, por lo que no podemos hacerlo. Sin embargo, podemos proporcionar un número entero, y eso hará que el elemento se indexe a ese valor. Intentemos obtener apple.com de nuestro ejemplo anterior.

Bingo: funciona. Un ejemplo más simple podría ser algo como esto.


17. groupBy ()

Puede pasar una cadena o una devolución de llamada al método groupBy, y le devolverá los resultados, agrupados por ese valor. Probemos esto usando el enfoque de cuerdas. Reconfiguraremos nuestra lista de URL y cambiaremos cada clave para que cada URL pertenezca a un cierto tipo de categoría. Podemos usar el método groupBy para obtener por categoría.

Siempre encontré que las operaciones groupBy type eran un poco complicadas y difíciles de predecir. El código fuente muestra que se trata de una operación un poco más compleja.


18. tiene ()

Ahora tenemos uno simple siguiendo el ejemplo más complejo de arriba. ¿Necesitas comprobar si existe una clave en tu colección? Simple, solo usa has ().

La fuente nos muestra cómo funciona esto.


19. implosión ()

Probablemente esté acostumbrado a tomar una matriz en PHP nativo e implementarla en una lista o línea de elementos separados por algún carácter aleatorio o grupo de caracteres. Puedes hacer lo mismo con tus colecciones con este método. Veamos un ejemplo.

Funciona tal como cree que lo haría, haciendo uso del PHP implode () nativo .


20. intersecar ()

Este método hace uso de array_intersect () como podemos ver aquí en la fuente que calcula la intersección de matrices.

También podemos calcular la intersección de colecciones, veamos un ejemplo.


21. está vacío ()

Muchas veces, una colección se pasa a una vista y no desea intentar recorrerla si está vacía. Este práctico método nos permite saber de inmediato si una colección tiene o no algo dentro. Vamos a ver cómo funciona.

La fuente nos muestra cómo hace uso de la función empty () de PHP .


22. keyBy ()

Al observar el código fuente de este método, podemos ver que hace uso del método valueRetriever (), así que echemos un vistazo a eso.

Una vez más vemos esa referencia al método data_get (), y es un poco extraño, así que inspeccionémoslo.

Este método parece ser uno de los caballos de batalla de la clase Collection y, como podemos ver, hace uso de is_null () , is_array () , array_key_exists () , isset () e is_object () entre otros.

Un ejemplo de cómo funciona keyBy () muestra que puede establecer las claves de la colección mediante la clave proporcionada a keyBy (). Observar.


23. llaves ()

Este práctico método le brinda la posibilidad de buscar solo las claves de la colección. Probémoslo en una de nuestras colecciones de tipos mixtos.

Una inspección revela una llamada a array_keys () .


24. último ()

Si desea acceder al último elemento de la colección, puede utilizar el método last (), que tiene el nombre adecuado. Algunos ejemplos están en orden. Primero no pasaremos ningún argumento, que simplemente captura el último elemento de la colección sin importar qué. El segundo ejemplo usará una devolución de llamada para encontrar el primer elemento comenzando desde el final de la colección que coincide con una prueba determinada.


25. mapa ()

Con este método podemos iterar a través de la colección y pasar cada elemento a una devolución de llamada que puede modificarlo. Vamos a ver cómo funciona.

Aquí está la fuente de map () que hace uso de array_keys () y array_map () .


26. fusionar ()

Podemos ver que merge () hace uso de array_merge () aquí.

Probarlo en un par de colecciones nos muestra cómo funciona.


27. desplumar ()

Uno de mis favoritos es el método de extracción, que le permite obtener todos los valores de una clave proporcionada en la colección. Probémoslo.

La fuente que hace posible pluck ().


28. pop ()

Pop se vuelve loco desde el final de la colección. En otras palabras, pop () elimina el último elemento de la colección.

Podemos ver el uso de array_pop () para ayudarnos desde la fuente.


29. anteponer ()

Para agregar algo al principio de una matriz, usualmente usamos array_unshift () . El método prepend () usa un nombre mucho más amigable para darnos una indicación de lo que hará. Probarlo nos da estos resultados.

Una inspección rápida de la fuente confirma el uso de array_unshift () para nosotros.


30. tirar ()

Pongámoslo pull()a prueba de inmediato.

pull () saca un elemento de la colección y se lo devuelve en función de la clave que le proporcione. Utiliza este código para que funcione su magia.


31. empujar ()

De nuevo, es muy probable que esté familiarizado con array_push () para poner cosas al final de una matriz. El método push () de laravel nos permite poner cosas al final de una colección. ¿Te gustaría ver?

Profundizar en la fuente nos da una idea de cómo funciona esto.


32. poner ()

put () es casi como push () con una implementación ligeramente diferente. Con put (), también usa el método offsetSet (), pero usa una firma diferente.

Probar esto nos muestra la diferencia en cómo funciona.

Con este ejemplo, puede ver que podemos sobrescribir los valores existentes en cualquier parte de la colección si lo deseamos, o simplemente agregar un nuevo elemento tanto de clave como de valor.


33. aleatorio ()

random () nos permite acceder a la colección y extraer un elemento completamente impredecible y aleatorio. Un vistazo rápido a la fuente nos muestra cómo completa esta tarea.

Hay un poco de lógica entre el uso de array_rand () , array_intersect_key () y array_flip () . Probémoslo.


34. reducir ()

Este método es como una iteración recursiva hasta un elemento de la colección utilizando la función array_reduce () de PHP Lo determinamos viendo la fuente.

Junto con una prueba rápida.


35. rechazar ()

Vimos un ejemplo de este método al principio del artículo cuando rechazamos cualquier URL de la colección con un valor de cadena de facebook dentro. Veamos la fuente para ver cómo funciona.

Probándolo de nuevo, esta vez rechazaremos cualquier elemento de la colección que contenga la cadena 'descubrir'.


36. reverso ()

El método reverse () hace lo que esperas y es invertir el orden de los elementos de la colección. Lo hace usando array_reverse () como podemos ver aquí.

No olvides que todos estos métodos son fluidos, así que recordémoslo ahora.


37. buscar ()

Convenientemente, también puede buscar a través de una colección de laravel determinada utilizando el práctico método search (). Buscó por valor y devuelve la clave si la encuentra. La función usa las funciones array_search () y call_user_func () para hacer que suceda la magia.

Nuestra prueba muestra que funciona en acción.


38. shift ()

shift () es un pequeño contenedor agradable para array_shift () que toma el primer elemento del comienzo de una matriz.

¿Funciona? Puedes apostar. Nuevamente, tenga en cuenta el estilo fluido.


39. barajar ()

Hace que sea conveniente usar el estilo fluido a través de la función PHP shuffle () incorporada.

Aquí está nuestra pequeña prueba.


40. rebanada ()

array_slice () se usa comúnmente en muchos proyectos PHP. Laravel incluye esto en su clase de colección a través del siguiente código.

Este método es muy poderoso. Puede pasar un valor único para determinar dónde comenzará el segmento. En ese momento, devolverá el resto de los elementos de la colección a partir de ese punto que proporcionó. Sin embargo, cuando pienso en cortar, generalmente pienso que significa cuando se llega a una matriz o colección y se saca un número específico de elementos en un punto de partida específico. También puede hacer esto con slice (), todo lo que tiene que hacer es pasar la cantidad de elementos que le gustaría como segundo argumento. Finalmente, también tiene la opción de tener nuevas teclas numéricas basadas en el nuevo segmento o la capacidad de retener las claves originales. Pase verdadero como tercer argumento si desea mantener intactas las claves originales. Probemos los tres a la vez (tenga en cuenta que pasamos los tres parámetros).


41. sort ()

Puedes ordenar tus colecciones usando el método sort (). El código de Laravel que lo alimenta usa uasort () como puede ver aquí.

Aquí podemos verlo en acción.


42. sortBy ()

Este método es realmente útil para usar con Eloquent, ya que a menudo necesitamos ordenar los datos de una base de datos. La fuente está involucrada, así que tómese unos minutos para revisar.

Probar sortBy () muestra que funciona muy bien.


43. sortByDesc ()

Por extraño que parezca, uno de mis favoritos personales, ordena los resultados como sortBy () pero en la dirección opuesta.


44. empalme ()

splice () funciona con la función PHP array_splice () como se ve aquí. Esto le permite eliminar un elemento o elementos de la colección y reemplazarlos con otra cosa.

Podemos probar esto mientras eliminamos dos elementos que comienzan en el índice 3 y reemplazamos el agujero que queda con dos nuevas URL.


45. suma ()

Un método de suma rápido y sencillo que puede utilizar como tal.

Cuando haya anidado matrices u objetos, simplemente pase la clave con la que desea sumar.


46. ​​tomar ()

Cuando tienes una gran colección en tus manos y solo necesitas una cantidad limitada de artículos, take () es tu amigo. ¿Tienes 100 artículos y solo necesitas 5? tomar (5). Quizás necesites perder una libra o dos. Tome solo los dos primeros de nuestro ejemplo anterior.


47. toArray ()

A veces, es posible que te quedes atascado trabajando con un problema de colección que no puedes resolver. Cuando necesite desplegar una matriz PHP simple y antigua, puede usar toArray () para hacerlo.

Tenga en cuenta que el resultado es una matriz, no una colección.


48. toJson ()

También puede convertir a JSON fácilmente.


49. transform ()

Con transform () puede modificar la colección directamente iterando sobre ella con una devolución de llamada.


50. único ()

unique () es otro método que disfruto bastante. Devolverá solo los valores únicos en la colección usando este código aquí.

Una prueba rápida nos muestra su dominio en acción.


51. valores ()

Este es un pequeño método genial que devuelve la colección con las claves configuradas para incrementar los números.

Primero sin valores ()

Ahora con los valores () aplicados.


52. donde ()

Este es un buen método que puede utilizar para encontrar un par clave-valor en su colección. Tenga en cuenta que esto no es lo mismo que la base de datos relacionada con where () ya que puede emplear operadores como mayor que, menor que, me gusta, etc. Vamos a probarlo.


53. zip ()

Finalmente, tenemos el método zip () que combina valores de una matriz proporcionada con los valores de su colección donde las posiciones de índice son iguales. Agreguemos una garantía a todos los autos de nuestro ejemplo anterior como prueba.


La motivación de este tutorial

Parece que cuando estás usando Laravel, ciertas cosas siguen apareciendo una y otra vez. Lo primero es sin duda la arquitectura que utiliza el marco, los proveedores de servicios y la comprensión de cómo funciona la inversión del contenedor de control. Hay algunas cosas fundamentales que todos intentamos tener en nuestro haber. Parecía que las colecciones eran las siguientes en cuanto a algo de lo que valdría la pena tener una comprensión realmente sólida. ¿Qué mejor manera de aprenderlo que completar el tutorial de colecciones de mega laravel? Además, siempre es realmente esclarecedor mirar bajo el capó la fuente para ver cómo ocurre la magia. Comprender la herramienta o el marco que utiliza le da confianza.


Resumen y lectura adicional

  • Hay muchos enlaces en este tutorial que enlazan directamente con las funciones PHP que se utilizan para crear la clase Colecciones. Lea sobre ellos o revíselos: puede aprender una cosa o dos o simplemente refrescar su memoria sobre un concepto que se había olvidado.
  • Si bien aquí cubrimos las colecciones de laravel simples de vainilla, asegúrese de consultar el tutorial de Dayle Rees sobre Eloquent Collections . Es el mejor que he visto.
  • Si aún no tiene una suscripción a Laracasts, obtenga una y revise su tutorial sobre Colecciones, es fantástico.
  • Jens Segers tiene este increíble tutorial sobre colecciones de laravel, ¡léelo!
  • Eric Barnes también tiene excelentes recursos para colecciones en laravel news.
  • Stupid Collection Tips (¡que son realmente geniales!) Por Jeff Madsen

¡Y con eso, nuestro Tutorial de colecciones de Laravel está completo!