jairogarcíarincón

Arrays


7.44K

Introducción



Los arrays son, sin duda, la estructura de datos más potente de PHP, así como de muchos otros lenguajes.

Se flexibilidad les permite almacenar cualquier tipo de valor, incluyendo otros arrays, y es por ello que PHP tiene más de 70 funciones diseñadas exclusivamente para manipular arrays y que se pueden consultar en la página oficial de PHP.

Un array es una colección ordenada de ítems o elementos. Cada elemento posee un valor o value y es identificado dentro del array por un índice único o key, que puede ser de tipo int o de tipo string.

Podemos crear arrays indistintamente utilizando el constructor array() o bien mediante el operador []. A continuación se muestran ejemplos de las dos maneras:



Es importante remarcar que, si no indicamos el índice o key, PHP asignará automáticamente uno numérico, empezando por 0.

Una vez inicializado el array, es posible acceder a él o incluso imprimirlo entero de diferentes maneras:



Los arrays se pueden dividir en dos grandes grupos, los enumerativos y los asociativos:

  1. arrays enumerativos: aquellos que son indexados solo utilizando valores numéricos
  2. arrays asociativos: aquellos que son indexados con cualquier tipo de indice, sea numérico o string.


En PHP, los índices o keys de los arrays no tienen por qué ser consecutivos - ni siquiera positivos, incluso admite valores negativos -, de modo que podemos tener espacios en el indexado del array sin que eso suponga mayor problema. Así, por ejemplo, si se añade un elemento a un array sin especificar su key, automáticamente se le aplica el último índice numérico del array + 1, incluso en el caso de los asociativos.

Además, ya que dijimos que los arrays pueden contener cualquier tipo de valor, incluso otros arrays, también es posible utilizar arrays multidimensionales.



Operaciones con arrays



Es posible utilizar operadores con arrays, tal y como vimos anteriormente con otros tipos de variables, si bien en este caso, los resultados no son tan evidentes. Por ejemplo, utilizando el operador suma + podemos combinar dos o más arrays, de modo que el array resultante incluirá todos los elementos de los dos arrays originales, aunque tengan los mismo valores. Sin embargo, si los dos arrays comparten índices y valores, solo aparecerán una vez en el array resultado. En cualquier caso, no es una herramienta muy utilizada.

Otra operación, aunque también poco frecuente, es la de comparar arrays. Dos arrays se considerarán iguales (operador ==) siempre que tengan el mismo número de elementos con los mismos valores e índices, independientemente del orden. Se considerarán idénticos (operador ===) solo si además están en el mismo orden.

Otras operaciones últiles:

  • El tamaño de un array se puede recoger con la función count().
  • Para comprobar si existe un elemento con un un determinado índice dentro del array, debemos utilizar la función array_key_exists().
  • Para comprobar si existe un elemento con un un determinado valor utilizaremos in_array().
  • Para eliminar un elemento concreto de un array, utilizaremos la función unset().




Iteraciones con arrays



Cuando utilicemos arrays para almacenar cualquier tipo de datos, sin duda lo que más nos va a interesar es saber cómo podemos recorrer y acceder a esos datos.

La forma más común de hacerlo será mediante un bucle foreach, recorriendo solo los valores o los índices y los valores, como ya vimos anteriormente y según nuestras necesidades:



Ordenando arrays



Existen 11 funciones de PHP cuyo objetivo es la ordenación de arrays.

La más simple de todas ellas es sort(), que ordena en función de los valores. Es válida para arrays unidimensionales en los que los índices no son importantes, ya que, como muestra el siguiente ejemplo, esta función destruye los índices originales asignando unos nuevos de forma numérica.

Si lo que queremos es ordenar en función de los valores pero conservando los índices originales, debemos utilizar la función asort().



En ambos casos, la ordenación es ascendente. Para hacer la ordenación descendente debemos utilizar, respectivamente, las funciones rsort() y arsort(). Además, podemos añadir un segundo argumento a la función para indicar el tipo de comparación que más nos convenga a la hora de realizar la ordenación:

  • SORT_REGULAR: Comparación tal cual, sin ninguna conversión de los datos. Es la que usa por defecto.
  • SORT_NUMERIC: Cada elemento es convertido a un valor numérico antes de la comparación.
  • SORT_STRING: Compara todos los elementos como cadenas o strings.


Puesto que la ordenación en estos casos se hace de forma numérica o byte a byte en el caso de los strings, en ocasiones puede resultar poco natural, ya que, por ejemplo, '10t' será considerado menor que '2t' al empezar por un 1. Para solucionar esto, se puede usar natsort(), que además mantiene, al igual que asort(), los índices originales. Si además queremos hacer la ordenación insensible a mayúsculas y minúsculas, debemos usar natcasesort().

Además de las funciones comentadas y de manera análoga a asort() y arsort(), es posible la ordenación en función de los índices o keys, utilizando en este caso las funciones ksort() y krsort(), respectivamente.

También es posible realizar la ordenación de un array a partir de una función definida por el usuario mediante el uso de las funciones:

  • usort(): por valores sin respetar índices
  • uasort(): por valores respetando índices
  • uksort(): por índices


En este caso, primero tendremos que declarar la función de comparación y luego aplicar la función de ordenación correspondiente:



Al igual que existen funciones de ordenación, existe una función que nos permite desordenar un array de manera aleatoria sin respetar los índices con la función shuffle(). No obstante es posible mantener los índices originales si previamente los extraemos con la función array_keys(), una función que devuelve un array cuyos valores son los índices del array de entrada. El uso de estas funciones se muestra en el siguiente ejemplo:



Si sólo necesitáramos extraer uno o más elementos aleatorios de un array, podemos usar la función array_rand($array, num), donde num es el número de elementos que queremos extraer. El resultado será un array con los elementos extraídos.

Y para terminar, es posible ordenar un array asociativo multidimensional mediante la función array_multisort(), si bien esto requiere de un array intermedio en el que extraigamos la "columna" de ordenación. El uso de esta función queda detallado en el siguiente ejemplo:



Los arrays como stacks o queues

Frecuentemente utilizaremos los arrays como pilas o stacks (estructuras LIFO), o como colas o queues (estructuras FIFO). Para estos casos, PHP proporciona una serie de funciones que nos pueden facilitar la tarea.



Conclusiones



Antes de plantear la primera práctica del curso, se proponen una serie de ejercicios que ayuden a la comprensión de los conceptos adquiridos.

Ejercicios propuestos



  1. Desarrolla un array multidimensional que incluya todos los días del año de modo que se pueda acceder a cada elemento en la forma $array[6][15] y un echo devuelva "15 de Junio".

  2. Crea una función que muestre en pantalla una tabla con el contenido del array superglobal de PHP $_SERVER, incluyendo el significado de cada índice.

  3. Crea una función que, dado un array de enteros de 0 a 100, extraiga 3 elementos al azar y devuelva la media de ellos en formato "La media de num1, num2 y num3 es resultado".

  4. Crea un array asociativo con los nombres y números de los meses del año e imprímelo. A continuación, ordénalo de forma ascendente respetando los índices según el tamaño del texto.

  5. Modifica el ejemplo anterior para que el orden sea descendente.

  6. Crea un array asociativo de al menos 10 productos con nombre, precio y tipo de iva (1, 2, 3 ó 4). Crea un array de ivas con los tipos de iva como índices y el porcentaje de iva como valores (0, 0.04, 0.1 y 0.21). Recorre el array de productos y muestra en pantalla el listado de productos, su precio sin iva, el tipo de iva y su precio con iva.

  7. Modifica el ejercicio anterior para que muestre los productos ordenados por nombre.

  8. Modifica el ejercicio anterior para que muestre los productos ordenados por su precio con iva.

  9. Desarrolla un juego web que, a partir de una baraja española de mus (esto es, sin 8, 9 y 10) permita:
    1. Mostrar una carta de un palo determinado al azar
    2. Mostrar una mano de mus de dos jugadores (4 cartas del as al rey para cada uno al azar sin que se repitan)
    3. Mostrar una mano de las anteriores y comprobar quién se llevaría el “juego” (si lo llevan).
    4. PLUS: Mostrar una mano de las anteriores y comprobar quién se llevaría los “pares” (si lo llevan).
    5. PLUS: Mostrar una mano de las anteriores y comprobar quién lleva más “a la grande”.
    6. PLUS: Mostrar una mano de las anteriores y comprobar quién lleva más “a la chica”.


Publicado el 21 de Octubre de 2021

phpvariablesbuclesarrays