Apuntes PHP – Arrays

Desde que empezamos con php he de reconocer que he encontrado constantemente un gran parecido con Java, lo que hace que la lógica de funcionamiento sea muy similar. En el caso de los Arrays las bases son muy similares (a fin de cuentas, por algo se llaman también arrays), pero bajo mi punto de vista, presentan un potencial mucho más elevado, principalmente al permitir alternar diferentes tipos de dato en el mismo.

Al igual que me pasó con Java, creo que los Arrays van a ser un gran aliado a la hora de hacer los diferentes programas ayudando a crear un código más automatizado y limpio.

Estos apuntes, están basados en los facilitados por José Aguilera para el seguimiento de la clase de Desarrollo Web en Entorno Servidor de 2º de DAW en el I.E.S. Gran Capitán de Córdoba y también utilizamos la documentación oficial de php que puedes consultar aquí.

Pero volviendo a los apuntes en sí mismo, recordemos los conceptos de Array, Array multidimensional, Array asociativo, Array indexado…

Un array es un tipo de dato, que en su interior puede contener varios datos a los que podemos acceder mediante “índices”, este concepto es similar al que en matemáticas conocemos como vector.

Array multidimensionalEs un array cuyo contenido es uno o más arrays, y por tanto se necesitan varios índices para el acceso a los valores finales.
Array indexadoEs el array “básico”, en el mismo sus elementos se encuentran referenciados de forma numérica.
Array asociativoEs un tipo de array donde el índice de los elementos no es numérico, sino una cadena de caracteres.

Arrays indexados

Los arrays indexados utilizan un índice numérico para acceder al valor almacenado, este índice puede ser cualquier número, pero lo recomendado y habitual, es empezar por 0.

Cómo crear un array indexado

Mediante la función array();

Si vas a crear un array del que inicialmente ya conoces algunos valores, la forma más sencilla es mediante el uso de la función array();

<?php
    $meses = array("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre");
?>

Estos datos, serían accesibles utilizando $meses[indice], por ejemplo “Enero” sería el valor perteneciente a $meses[0].

Creación del array asignando directamente el contenido

La versatilidad de php nos permite crear un array asignando directamente el valor a la posición deseada (por eso el índice no siempre tiene que ser 0, aunque si es lo recomendable).

<?php
    $meses[0] = "Enero";
    $meses[1] = "Febrero";
    $meses[2] = "Marzo";
    $meses[3] = "Abril";
    $meses[4] = "Mayo";
   // ... así hasta completar el array
?>

Modificación de datos en un array y adición de contenido.

Para modificar los datos de un Array, podemos acceder directamente a la posición que queremos modificar y asignarle el valor modificado Ej:

$meses[0] = “Borramos enero”; (esto quitaría el valor Enero y lo sustituiría por esta frase”.

Del mismo modo, también podríamos añadir valores directamente al final del array del siguiente modo:

$meses[] = "Junio";

En el array anterior que habíamos dejado en Mayo, esta asignación ocuparía el índice 5.

Arrays asociativos

Como indicaba más arriba, los arrays asociativos son aquellos que no tienen un índice numérico para referenciarlos sino una cadena de caracteres.

Crear un array asociativo

Al igual que en los arrays indexados, tenemos dos formas de crear un array asociativo, mediante la función array o asignando directamente el índice y contenido.

Mediante la función array

En el caso de crear un array asociativo mediante el uso de la función array(), la sintaxis que debemos seguir es la siguiente:

$nombreArray = array("clave" => "valor", "clave2" => "valor2");

Dejamos un ejemplo a continuación de cómo podría ser un array asociativo en el que almacenaremos la información sobre un alumno:

<?php
    $alumno = array("nombre" => "Manolo", "apellidos" => "Hidalgo Pérez", "curso" => "2DAW", "edad" => 34); 
?>

Como podemos observar, este array incluiría la información sobre un alumno en concreto, con las claves “nombre”, “apellidos”, “curso” y “edad” y almacenaría sus valores correspondientes, donde además, podemos ver que pueden ser valores de distintos tipos, tanto string como int.

Creación del array asignando directamente el contenido.

Al igual que hemos visto en los arrays indexados, también podríamos crear el array asociativo asignando directamente los valores, en ese caso lo haríamos de la siguiente forma:

<?php
    $alumno["nombre"] = "Manolo";
    $alumno["apellidos"] = "Hidalgo Pérez";
    $alumno["curso"] = "2DAW";
    $alumno["edad"] = "34";
?>

En ambos casos, el array generado sería el mismo.

Arrays multidimensionales

En el caso de los arrays podemos tener arrays multidimensionales, esto vendría a traducirse, como arrays dentro de otros arrays.

El uso de esto resulta bastante interesante, ya que de esta forma podemos crear arrays con un contenido muy extenso y bien clasificado, como si fuese un JSON.

Un ejemplo de array multidimensional, sería uno que almacene la información de todos los alumnos de 2DAW, esto sería por ejemplo, un array que podríamos llamar $clase y que contendría un un array indexado, donde cada elemento fuese otro array $alumno:

Ejemplo:

<?php
    $clase = array (array("nombre" => "Manolo", "apellidos" => "Hidalgo Pérez", "edad" => 34),
                    array("nombre" => "Pepe", "apellidos" => "Gálvez Rodríguez", "edad" => 28),
                    array("nombre" => "Juan", "apellidos" => "Marqués Ortiz", "edad" => 19));
?>

En este caso, para acceder al valor en concreto necesitaríamos de dos índices, por ejemplo, para obtener “Manolo”, deberíamos acceder a $clase[0][‘nombre’].

Manejo de los Arrays.

Como decía anteriormente, el manejo de los arrays es algo primordial a la hora de almacenar información y trabajar con ella.

Para poder acceder a esta información debemos ser capaces de recorrer los arrays, esto lo podemos hacer mediante instrucciones repetitivas (bucles for o foreach).

Bucle for y función count();

Personalmente, el método for es el que menos me gusta, ya que podríamos tener problemas para acceder a índices puntuales, por salirnos del rango, porque se hayan incluido los valores de forma manual y algunos índices no existan, etc.

No obstante, incluyo una prueba para recorrerlo con la función for, imaginemos que tenemos el array $meses que creamos anteriormente y que sus índices son del 0 al 11, que sería el caso más habitual.

Si queremos hacer un programa que nos muestre en pantalla el mes que está recorriendo en cada iteración, deberíamos, en primer lugar, conocer la longitud del array y posteriormente recorrerlo en el bucle for.

<?php
    $meses = array("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre");
    
    // Para conocer el tamaño del array, utilizaremos la función count()
    $longitud = count($meses);

    for ($i=0;$i < $longitud; $i++){ 
        echo $meses[$i].'</br>';
    }
?>

De este modo, aparecería en pantalla el nombre de todos los meses en distintas líneas (por la inclusión de </br>).

Pero si por ejemplo, el código fuese el siguiente, “Diciembre”, al asignarle el índice 20, no lo mostraría.

<?php
    $meses[0] = "Enero";
    $meses[1] = "Febrero";
    $meses[2] = "Marzo";
    $meses[3] = "Abril";
    $meses[4] = "Mayo";
    $meses[5] = "Junio";
    $meses[6] = "Julio";
    $meses[7] = "Agosto";
    $meses[8] = "Septiembre";
    $meses[9] = "Octubre";
    $meses[10] = "Noviembre";
    $meses[20] = "Diciembre";
    // Para conocer el tamaño del array, utilizaremos la función count()
    $longitud = count($meses);

    for ($i=0;$i < $longitud; $i++){ 
        echo $meses[$i].'</br>';
    }
?>

Bucle foreach

Para solucionar este problema, podemos utilizar el bucle foreach, que además, nos permitirá recorrer tanto los arrays indexados como los asociativos.

En el caso de un array indexado, la forma de utilizar un bloque foreach sería del siguiente modo:

foreach ($array as $valor){
instrucciones
}

Veamos un ejemplo, utilizando de nuevo el array de los meses, como puedes observar, al recorrer el array de este modo, nuestro programa lo que haría es buscar en el array $meses, los valores que tiene almacenados, buscaría el primero y lo almacenaría en la variable $mes, a continuación lo mostraría y volvería a realizar otra iteración, avanzando una posición y asignando a la variable $mes el siguiente valor, así sucesivamente. Esto lo haría hasta llegar al último valor de nuestro array, independientemente del indice que nosotros le hubiésemos asignado.

<?php
    $meses = array("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre");
    
    foreach ($meses as $mes) {
        echo $mes.'</br>';
    }
?>

En el caso de los arrays asociativos, tenemos dos opciones para la lectura del bucle foreach, si bien nos interesa exclusivamente el valor final almacenado, o si también deseamos conocer su clave. En el primer caso, sería exactamente igual que para los arrays indexados.

foreach ($array as $valor){
instrucciones
}

<?php
    $alumno = array("Nombre" => "Manolo", "Apellidos" => "Hidalgo Pérez", "Curso" => "2DAW", "Edad" => 34); 

    foreach ($alumno as $valor) {
        echo $clave.': '.$valor.'</br>';
    }
?>

En este caso, nos mostraría en pantalla:

Manolo
Hidalgo Pérez
2DAW
34

Sin embargo, también puede interesarnos conocer cual es la clave del array para operar en consonancia, por ejemplo para explicar que es cada valor, o para aplicar unas funciones u otras en consonancia, etc. esto ya es según las exigencias del programa o ejercicio a desarrollar.

En ese caso, la estructura foreach nos permite almacenar tanto los valores, como la clave del índice y su sintaxis sería la siguiente:

foreach ($array as $clave => $valor){
instrucciones
}

<?php
    $alumno = array("Nombre" => "Manolo", "Apellidos" => "Hidalgo Pérez", "Curso" => "2DAW", "Edad" => 34); 

    foreach ($alumno as $clave => $valor) {
        echo $clave.': '.$valor.'</br>';
    }
?>

Haciendo uso del array asociativo que creamos con los datos personales del alumno, vamos a ver un ejemplo del mismo, donde el array $alumno será recorrido, almacenando su índice en la variable $clave y su valor en $valor.

Esto nos permitirá realizar una estructura como la que sigue, que mostrará en pantalla:

Nombre: Manolo
Apellidos: Hidalgo Pérez
Curso: 2DAW
Edad: 34

Como vemos, dependiendo de lo que necesitemos mostrar en pantalla y a que datos acceder podemos trabajar de diferentes formas y utilizar el foreach a conveniencia.

Recorrer un array multidimensional con foreach

Esta parte quizás sea la más compleja de la lectura de arrays, ya que se trata de “arrays dentro de arrays” y según la complejidad del mismo, puede tener varias capas, y hay que conocer muy bien su estructura para poder desarrollar su lectura, pero analizándolo con calma puedes ver que es muy sencillo, pues se trata de hacer distintos bucles anidados.

Viendo el ejemplo del array multidimensional que hicimos de $clase, podríamos leer la información de los alumnos y mostrarla en pantalla de la siguiente forma:

Primer bucle foreach
Este bucle nos hará el recorrido a través de los diferentes índices de $clase, como recordamos, este era un array indexado, que en su interior contenía otros arrays asociativos. Esto quiere decir que en la lectura de este array con el foreach nos devolverá lo siguiente:

foreach ($clase as $alumno) {
esto lo desarrollaremos en el segundo punto.
}

En cada iteración, recibiremos $alumno, que es un array asociativo como hemos dicho con anterioridad, de aquí es donde ahora debemos sacar su clave y su valor para poder mostrar el resultado en pantalla, y lo hacemos mediante un nuevo foreach

Segundo bucle foreach
Este segundo bucle, realiza la lectura de clave y de valor, con lo que debemos utilizar la segunda forma de uso del foreach que hemos visto anteriormente, de forma que este bucle, que recordemos, estaría anidado en el anterior quedaría así:

foreach ($alumno as $clave => $valor){
mostrariamos datos de alumno
}

De esta forma, el código completo quedaría así:

<?php
    $clase = array (array("nombre" => "Manolo", "apellidos" => "Hidalgo Pérez", "edad" => 34),
                    array("nombre" => "Pepe", "apellidos" => "Gálvez Rodríguez", "edad" => 28),
                    array("nombre" => "Juan", "apellidos" => "Marqués Ortiz", "edad" => 19));

    foreach ($clase as $alumno) {
        echo "<b>Alumno</b></br>"; // esta línea incluye una cabecera en negrita antes de cada alumno.
        foreach ($alumno as $clave => $valor) {
            echo $clave.': '.$valor.'</br>';
        }
        echo "<p>"; // finaliza la ficha de alumno añadiendo un salto de párrafo
    }
    
?>

El resultado que devolvería en pantalla sería:

Alumno
nombre: Manolo
apellidos: Hidalgo Pérez
edad: 34

Alumno
nombre: Pepe
apellidos: Gálvez Rodríguez
edad: 28

Alumno
nombre: Juan
apellidos: Marqués Ortiz
edad: 19

Como puedes ver es una forma de almacenar diferente información, ya que esto lo podríamos ampliar tanto como quisiéramos, ya que por ejemplo, se podría añadir un campo más que contenga un array “asignaturas” y dentro de él aquellas en las que el usuario está matriculado, etc.