Trabajando con matrices PHP de la manera correcta

En este tutorial, voy a hacer una lista de funciones comunes de matriz de PHP con ejemplos de uso y mejores prácticas. Todo desarrollador de PHP debe saber cómo usarlos y cómo combinar funciones de matriz para hacer que el código sea legible y breve.

Además, hay una presentación con ejemplos de códigos dados, por lo que puede descargarla de los enlaces relacionados y mostrarla a sus colegas para formar un equipo más fuerte..

Los basicos

Comencemos con las funciones básicas que funcionan con valores y claves de matriz. Uno de ellos es array_combine (), que crea una matriz utilizando una matriz para las claves y otra para sus valores:

$ keys = ['sky', 'grass', 'orange']; $ valores = ['azul', 'verde', 'naranja']; $ array = array_combine ($ keys, $ values); print_r ($ array); // Array // (// [sky] => blue // [grass] => green // [orange] => orange //) 

Debe saber que la función array_values ​​() devuelve una matriz de valores indexada, array_keys () devuelve una matriz de claves de una matriz determinada, y array_flip () intercambia claves con valores:

print_r (array_keys ($ array)); // ['sky', 'grass', 'orange'] print_r (array_values ​​($ array)); // ['blue', 'green', 'orange'] print_r (array_flip ($ array)); // Array // (// [blue] => sky // [green] => grass // [orange] => orange //)

Haz tu código más corto

La lista de funciones (), que no es realmente una función, sino una construcción de lenguaje, está diseñada para asignar variables de manera breve. Por ejemplo, aquí hay un ejemplo básico de usar el lista() función:

// define array $ array = ['a', 'b', 'c']; // sin lista () $ a = $ array [0]; $ b = $ array [1]; $ c = $ array [2]; // con list () list ($ a, $ b, $ c) = $ array;

Esta construcción funciona perfectamente con funciones como preg_slit () o  explotar() . Además, puede omitir algunos parámetros, si no necesita que se definan:

$ string = 'hola | salvaje | mundo'; list ($ hello,, $ world) = explode ('|', $ string); echo ("$ hola, $ mundo"); // Hola Mundo

también, lista() se puede utilizar con para cada, lo que hace que esta construcción sea aún mejor:

$ arrays = [[1, 2], [3, 4], [5, 6]]; foreach ($ arreglos como lista ($ a, $ b)) $ c = $ a + $ b; echo ($ c. ','); // 3, 7, 11,

Con la función de extracción (), puede exportar una matriz asociativa a variables. Para cada elemento de una matriz, se creará una variable con el nombre de una clave y un valor como un valor del elemento:

$ array = ['clothes' => 't-shirt', 'size' => 'medium', 'color' => 'blue',]; extracto ($ array); echo ("$ clothes $ size $ color"); // camiseta azul medio

Sé consciente de extraer() no es seguro si está trabajando con datos de usuario (como resultados de solicitudes), por lo que es mejor usar esta función con los indicadores EXTR_IF_EXISTS y EXTR_PREFIX_ALL.

Lo opuesto a la función anterior es la función compacta (), que crea una matriz asociativa a partir de variables:

$ ropa = 'camiseta'; $ size = 'medium'; $ color = 'azul'; $ array = compacto ('ropa', 'tamaño', 'color'); print_r ($ array); // Array // (// [ropa] => camiseta // [tamaño] => medio // [color] => azul //)

Funciones de filtrado

Hay una gran función para el filtrado de matrices, y se llama array_filter (). Pase la matriz como primer parámetro y una función anónima como segundo parámetro. Regreso cierto en una función de devolución de llamada si desea dejar este elemento en la matriz, y falso si no lo haces

$ números = [20, -3, 50, -99, 55]; $ positivo = array_filter ($ números, función ($ número) return $ número> 0;); print_r ($ positivo); // [0 => 20, 2 => 50, 4 => 55] 

Hay una forma de filtrar no solo por los valores. Puedes usar ARRAY_FILTER_USE_KEYARRAY_FILTER_USE_BOTH como tercer parámetro para pasar la clave o ambos valores y clave a la función de devolución de llamada.

Además, puedes llamar array_filter () sin una devolución de llamada para eliminar todos los valores vacíos:

$ números = [-1, 0, 1]; $ not_empty = array_filter ($ numbers); print_r ($ not_empty); // [0 => -1, 2 => 1]

Solo puede obtener valores únicos de una matriz mediante la función array_unique (). Observe que la función conservará las claves de los primeros elementos únicos:

$ array = [1, 1, 1, 1, 2, 2, 2, 3, 4, 5, 5]; $ uniques = array_unique ($ array); print_r ($ uniques); // Array // (// [0] => 1 // [4] => 2 // [7] => 3 // [8] => 4 // [9] => 5 //) 

Con array_column (), puede obtener una lista de valores de columna de una matriz multidimensional, como una respuesta de una base de datos SQL o una importación de un archivo CSV. Simplemente pase un nombre de matriz y columna:

$ array = [['id' => 1, 'title' => 'tree'], ['id' => 2, 'title' => 'sun'], ['id' => 3, 'title '=>' nube '],]; $ ids = array_column ($ array, 'id'); print_r ($ ids); // [1, 2, 3] 

A partir de PHP 7, array_column () se vuelve aún más poderoso, porque ahora se le permite trabajar con una variedad de objetos. Así que trabajar con una variedad de modelos ahora es más fácil:

$ cinemas = Cinema :: find () -> all (); $ cinema_ids = array_column ($ cinemas, 'id'); // php7 para siempre!

Caminando a traves de las matrices

Usando array_map (), puede aplicar una devolución de llamada a cada elemento de una matriz. Puede pasar un nombre de función o una función anónima para obtener una nueva matriz basada en la matriz dada:

$ cities = ['Berlin', 'KYIV', 'Amsterdam', 'Riga']; $ aliases = array_map ('strtolower', $ cities); print_r ($ aliases); // ['berlin', 'kyiv,' amsterdam ',' riga '] $ numbers = [1, -2, 3, -4, 5]; $ cuadrados = array_map (función ($ número) devolver $ número ** 2;, $ números); print_r ($ cuadrados); // [1, 4, 9, 16, 25]

Existe el mito de que no hay forma de pasar valores y claves de una matriz a una devolución de llamada, pero podemos eliminarla:

$ model = ['id' => 7, 'name' => 'James']; $ callback = function ($ key, $ value) return "$ key is $ value"; ; $ res = array_map ($ callback, array_keys ($ model), $ model); print_r ($ res); // Array // (// [0] => id es 7 // [1] => nombre es James //)

Pero esto se ve sucio. Es mejor usar array_walk () en su lugar. Esta función se ve igual que array_map (), pero funciona de manera diferente. En primer lugar, una matriz se pasa por una referencia, por lo que array_walk () no crea una nueva matriz, pero cambia una matriz dada. Entonces, como matriz de origen, puede pasar el valor de la matriz por una referencia en una devolución de llamada. Las claves de matriz también se pueden pasar fácilmente:

$ fruits = ['banana' => 'yellow', 'apple' => 'green', 'orange' => 'orange',]; array_walk ($ fruits, function (& $ value, $ key) $ value = "$ key is $ value";); print_r ($ frutas); // Array // (// [banana] => banana es amarilla // [apple] => apple es verde // [orange] => orange is orange //)

Uniéndose a las matrices

La mejor manera de combinar dos o más matrices en PHP es usar la función array_merge (). Los elementos de las matrices se fusionarán y los valores con las mismas claves de cadena se sobrescribirán con el último valor:

$ array1 = ['a' => 'a', 'b' => 'b', 'c' => 'c']; $ array2 = ['a' => 'A', 'b' => 'B', 'D' => 'D']; $ merge = array_merge ($ array1, $ array2); print_r ($ merge); // Array // (// [a] => A // [b] => B // [c] => c // [D] => D //) 

Para eliminar valores de matriz de otra matriz (o matrices), use array_diff (). Para obtener los valores que están presentes en las matrices dadas, use array_intersect (). Los siguientes ejemplos mostrarán cómo funciona:

$ array1 = [1, 2, 3, 4]; $ array2 = [3, 4, 5, 6]; $ diff = array_diff ($ array1, $ array2); print_r ($ diff); // [0 => 1, 1 => 2] $ intersect = array_intersect ($ array1, $ array2); print_r ($ intersect); // [2 => 3, 3 => 4]

Hacer las matemáticas con valores de matriz

Use array_sum () para obtener una suma de valores de array, array_product () para multiplicarlos, o cree su propia fórmula con array_reduce ():

$ números = [1, 2, 3, 4, 5]; echo (array_sum ($ numeros)); // 15 echo (array_product ($ numbers)); // 120 echo (array_reduce ($ numbers, función ($ carry, $ item) return $ carry? $ Carry / $ item: 1;)); // 0.0083 = 1/2/3/4/5 

Para contar todos los valores de una matriz, use array_count_values ​​(). Dará todos los valores únicos de una matriz dada como claves y un conteo de estos valores como un valor:

$ things = ['apple', 'apple', 'banana', 'tree', 'tree', 'tree']; $ valores = array_count_values ​​($ cosas); print_r ($ valores); // Array // (// [apple] => 2 // [banana] => 1 // [tree] => 3 //)

Generando Arrays

Para generar una matriz con un tamaño dado y el mismo valor, use array_fill ():

$ bind = array_fill (0, 5, '?'); print_r ($ bind); // ['?', '?', '?', '?', '?'] 

Para generar una matriz con un rango de claves y valores, como horas del día o letras, use range ():

$ letras = rango ('a', 'z'); print_r ($ letras); // ['a', 'b',…, 'z'] $ horas = rango (0, 23); print_r ($ horas); // [0, 1, 2,…, 23]

Para obtener una parte de una matriz, por ejemplo, solo los tres primeros elementos usan array_slice ():

$ números = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; $ top = array_slice ($ numbers, 0, 3); print_r ($ top); // [1, 2, 3]

Ordenando matrices

Es bueno recordar que cada función de clasificación en PHP funciona con matrices por referencia y devuelve cierto en el éxito o falso en el fracaso Hay una función de clasificación básica llamada sort (), y ordena los valores en orden ascendente sin preservar las claves. La función de clasificación puede ser precedida por las siguientes letras:

  • una, Clasificar las claves de conservación
  • k, ordenar por llaves
  • r, ordenar en orden inverso / descendente
  • tu, ordenar con una función de usuario

Puedes ver las combinaciones de estas letras en la siguiente tabla:

una k r tu
una un tipo
Arsort uasort
k ksort krsort
r Arsort krsort rsort
tu uasort
usort

Combinando funciones de matriz como un jefe

La verdadera magia comienza cuando comienzas a combinar funciones de matriz. Aquí es cómo puede recortar y eliminar valores vacíos en una sola línea de código con array_filter () y array_map ():

$ valores = ['decir', 'bye', ", 'a', 'espacios',"]; $ palabras = array_filter (array_map ('recortar', $ valores)); print_r ($ palabras); // ['say', 'bye', 'to', 'spaces']

Para crear una identificación de un mapa de títulos a partir de una variedad de modelos, podemos usar una combinación de array_combine () y array_column ():

$ modelos = [$ modelo1, $ modelo2, $ modelo3]; $ id_to_title = array_combine (array_column ($ models, 'id'), array_column ($ models, 'title'));

Para obtener los tres valores principales de una matriz, podemos usar array_count_values ​​(), Arsort (), y array_slice ():

$ letras = ['a', 'a', 'a', 'a', 'b', 'b', 'c', 'd', 'd', 'd', 'd', 'd ']; $ valores = array_count_values ​​($ letras); // obtener clave para contar la matriz arsort ($ valores); // ordenar la clave de conservación descendente $ top = array_slice ($ valores, 0, 3); // obtener top 3 print_r ($ top); // Array // (// [d] => 5 // [a] => 4 // [b] => 2 //)

Es fácil de usar array_sum () y array_map () Para calcular la suma de orden en unas pocas filas:

$ order = [['product_id' => 1, 'price' => 99, 'count' => 1], ['product_id' => 2, 'price' => 50, 'count' => 2], ['product_id' => 2, 'price' => 17, 'count' => 3],]; $ sum = array_sum (array_map (función ($ product_row) return $ product_row ['price'] * $ product_row ['count'];, $ order)); print_r ($ sum); // 250

Conclusión

Como puede ver, el conocimiento de las funciones de la matriz principal puede hacer que su código sea mucho más corto y más legible. Por supuesto, PHP tiene muchas más funciones de matriz, e incluso las funciones dadas tienen muchas variaciones para usar con parámetros e indicadores adicionales, pero creo que en este tutorial hemos cubierto los conceptos básicos que todo desarrollador de PHP debería saber..

Tenga en cuenta que he creado una presentación con los ejemplos dados, para que pueda descargarla de los enlaces relacionados y mostrarla a su equipo..

Si tiene alguna pregunta, no dude en preguntar en los comentarios del artículo.. 

Lecturas adicionales y enlaces relacionados

  • Arrays Manual en php.net
  • Funciones anónimas (cierres) en php.net
  • Descarga una presentación para tu equipo.