ARRAYS Y LISTAS EN PHP¶
Estos apuntes son material de consulta para el Lab 03. Cubren los conceptos que vas a aplicar allí: los tres tipos principales de arrays (indexados, asociativos y arrays de arrays), cómo recorrerlos con foreach, y dos funciones imprescindibles, count() y empty().
Qué es un array¶
Un array en PHP es una colección ordenada de valores guardada en una sola variable. Es el tipo de dato más usado en aplicaciones web: listas de incidencias, opciones de un formulario, filas de una tabla — todo pasa por arrays.
PHP tiene un solo tipo llamado array, pero lo usarás de tres formas distintas según cómo identifiques cada valor:
| Tipo de array | Cómo identificas cada elemento | Ejemplo típico |
|---|---|---|
| Indexado | Por número, empezando en 0 |
Lista de prioridades ('baja', 'media', 'alta') |
| Asociativo | Por una clave de texto | Una incidencia con sus campos (titulo, prioridad, ...) |
| Array de arrays | Combinación de los anteriores | Lista de incidencias (cada una es un array asociativo) |
Comparación con bash:
| Bash | PHP | Nota |
|---|---|---|
arr=("baja" "media" "alta") |
$arr = ['baja', 'media', 'alta']; |
PHP usa [ ] en lugar de ( ) |
echo ${arr[0]} |
echo $arr[0]; |
PHP no necesita ${ } |
arr+=("critica") |
$arr[] = 'critica'; |
[] al final del nombre añade al final |
Arrays en bash vs en PHP
En bash los arrays son limitados: solo tienen un nivel y las claves son numéricas (los arrays asociativos existen solo desde bash 4 y son incómodos de usar). En PHP son el tipo estrella: puedes anidarlos cuantos niveles quieras y mezclar claves numéricas con claves de texto.
Arrays indexados¶
Los arrays indexados guardan una lista de valores con índices numéricos automáticos que empiezan en 0:
Para añadir al final se usa $arr[] = $valor. PHP asigna el siguiente índice disponible automáticamente:
print_r()muestra la estructura completa de un array de forma legible. Es útil para depurar cuando quieres ver rápidamente el contenido. Para ver también los tipos, usavar_dump()(del Lab 02).
Arrays asociativos¶
Los arrays asociativos usan claves de texto en lugar de índices numéricos. Son el equivalente PHP de los diccionarios de Python o los objetos JSON, y son la forma natural de representar "una cosa con sus campos" — por ejemplo, una incidencia:
El operador => (lo leemos como "apunta a") separa la clave del valor. El formato habitual es una clave por línea, con las flechas alineadas para facilitar la lectura.
Modificar valores¶
Para cambiar el valor de una clave, le asignas un nuevo valor como si accedieras a ella:
Comprobar si una clave existe con isset()¶
Si intentas leer una clave que no existe, PHP muestra un aviso. Para comprobar antes de acceder, se usa isset():
Las claves distinguen mayúsculas
$incidencia['titulo'] y $incidencia['Titulo'] son claves distintas. Por convención, en este proyecto todas las claves van en minúsculas y sin tildes.
Arrays de arrays¶
La mayoría de listas reales de una aplicación son arrays de arrays asociativos: una lista en la que cada elemento es, a su vez, un array con sus campos. Por ejemplo, un listado de incidencias:
Para acceder a un campo concreto de un elemento concreto, combinas los dos tipos de acceso:
La estructura HTML natural para presentar un array de arrays es una tabla: cada elemento del array exterior se convierte en una fila <tr>, y cada campo del array asociativo interior en una celda <td>.
Recorrer arrays con foreach¶
foreach recorre todos los elementos de un array, uno a uno. Es el equivalente PHP del for item in lista de bash.
Tiene dos formas:
foreach ($array as $elemento) { ... } ## solo el valor
foreach ($array as $clave => $valor) { ... } ## clave y valor
Sintaxis alternativa dentro de HTML¶
Dentro de un bloque HTML usamos la sintaxis foreach (...): / endforeach en lugar de las llaves { }. Es más legible cuando se mezclan PHP y HTML, porque la etiqueta de cierre recuerda qué estás cerrando:
Compara con la forma clásica:
<?php foreach ($prioridades as $p) { ?>
<li><?= htmlspecialchars($p, ENT_QUOTES, 'UTF-8') ?></li>
<?php } ?>
Las dos funcionan, pero endforeach se lee mejor cuando el cuerpo del bucle tiene varias líneas de HTML.
Recorrer un array de arrays: generar una tabla¶
Observa dónde están el foreach y el endforeach: fuera de <tr>, no dentro. Por cada iteración del bucle se genera una fila completa. Meter el foreach dentro de <tr> es un error habitual que produce tablas rotas.
Recorrer con clave y valor¶
La segunda forma ($clave => $valor) es útil cuando quieres mostrar también la clave. Por ejemplo, para listar todos los campos de una incidencia sin nombrarlos uno a uno:
Cada foreach necesita su endforeach
Si te saltas un endforeach, la página entera deja de funcionar: PHP intentará seguir interpretando el resto del fichero como parte del bucle. Lo mismo pasará con endif, endwhile, etc., que verás en los próximos labs.
Contar y comprobar si un array está vacío¶
Dos funciones aparecen constantemente al trabajar con listas:
| Función | Qué devuelve |
|---|---|
count($array) |
Número de elementos (entero) |
empty($array) |
true si el array está vacío o no existe, false si tiene al menos un elemento |
Guardar el total en una variable¶
Cuando vas a usar el total varias veces en la misma página, es mejor calcularlo una vez y guardarlo en una variable:
Así evitas recorrer el array dos veces y el código queda más claro: si mañana cambias el cálculo del total (por ejemplo, para contar solo las abiertas), solo tocas una línea.
empty() para distinguir lista vacía de lista llena¶
empty() te permite saber si un array tiene contenido sin tener que escribir count($arr) > 0. Es lo que usarás en el Lab 04 junto con if para decidir qué pintar en la página (la tabla con las incidencias, o un mensaje "No hay incidencias registradas").
En el Lab 03 solo la conoces y la pruebas con var_dump(); aún no la combinas con if, porque los condicionales llegan en el Lab 04.
Función count en bash vs en PHP
En bash cuentas elementos de un array con ${#arr[@]}. En PHP, count($arr) hace exactamente lo mismo, pero con una sintaxis mucho más cómoda: una función normal a la que le pasas el array como argumento.