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:
Ver ejemplo de código
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:
Ver ejemplo de código
Los
arrays se pueden dividir en dos grandes grupos, los
enumerativos y los
asociativos:
- arrays enumerativos: aquellos que son indexados solo utilizando valores numéricos
- 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.
Ver ejemplo de código
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().
Ver ejemplo de código
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:
Ver ejemplo de código
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().
Ver ejemplo de código
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:
Ver ejemplo de código
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:
Ver ejemplo de código
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:
Ver ejemplo de código
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.
Ver ejemplo de código
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
- 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".
- 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.
- 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".
- 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.
- Modifica el ejemplo anterior para que el orden sea descendente.
- 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.
- Modifica el ejercicio anterior para que muestre los productos ordenados por nombre.
- Modifica el ejercicio anterior para que muestre los productos ordenados por su precio con iva.
- Desarrolla un juego web que, a partir de una baraja española de mus (esto es, sin 8, 9 y 10) permita:
- Mostrar una carta de un palo determinado al azar
- Mostrar una mano de mus de dos jugadores (4 cartas del as al rey para cada uno al azar sin que se repitan)
- Mostrar una mano de las anteriores y comprobar quién se llevaría el “juego” (si lo llevan).
- PLUS: Mostrar una mano de las anteriores y comprobar quién se llevaría los “pares” (si lo llevan).
- PLUS: Mostrar una mano de las anteriores y comprobar quién lleva más “a la grande”.
- PLUS: Mostrar una mano de las anteriores y comprobar quién lleva más “a la chica”.