Saltar a contenido

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:

1
2
3
4
5
$prioridades = ['baja', 'media', 'alta'];

## Acceder por índice:
echo $prioridades[0];   ## → baja
echo $prioridades[2];   ## → alta

Para añadir al final se usa $arr[] = $valor. PHP asigna el siguiente índice disponible automáticamente:

1
2
3
4
$estados   = ['pendiente', 'en_proceso'];
$estados[] = 'resuelto';   ## añade con índice 2

print_r($estados);
Array
(
    [0] => pendiente
    [1] => en_proceso
    [2] => resuelto
)

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, usa var_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:

$incidencia = [
    'id'          => 'inc001',
    'titulo'      => 'Impresora sin papel',
    'descripcion' => 'La impresora de la sala 201 no tiene papel.',
    'prioridad'   => 'alta',
    'estado'      => 'pendiente',
    'fecha'       => '2025-01-15',
];

echo $incidencia['titulo'];     ## → Impresora sin papel
echo $incidencia['prioridad'];  ## → alta

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:

$incidencia['estado'] = 'resuelto';

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():

1
2
3
if (isset($incidencia['prioridad'])) {
    echo 'Prioridad: ' . $incidencia['prioridad'];
}

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:

$incidencias = [
    [
        'id'        => 'inc001',
        'titulo'    => 'Impresora sin papel',
        'prioridad' => 'alta',
        'estado'    => 'pendiente',
        'fecha'     => '2025-01-15',
    ],
    [
        'id'        => 'inc002',
        'titulo'    => 'Proyector sin imagen',
        'prioridad' => 'media',
        'estado'    => 'en_proceso',
        'fecha'     => '2025-01-16',
    ],
];

Para acceder a un campo concreto de un elemento concreto, combinas los dos tipos de acceso:

echo $incidencias[0]['titulo'];   ## → Impresora sin papel
echo $incidencias[1]['estado'];   ## → en_proceso

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:

1
2
3
4
5
6
7
<ul class="lista-prioridades">
<?php foreach ($prioridades as $p): ?>
  <li>
    <?= htmlspecialchars($p, ENT_QUOTES, 'UTF-8') ?>
  </li>
<?php endforeach ?>
</ul>

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

<table>
  <thead>
    <tr><th>ID</th><th>Título</th><th>Prioridad</th><th>Estado</th></tr>
  </thead>
  <tbody>
  <?php foreach ($incidencias as $inc): ?>
    <tr>
      <td><?= htmlspecialchars($inc['id'],        ENT_QUOTES, 'UTF-8') ?></td>
      <td><?= htmlspecialchars($inc['titulo'],    ENT_QUOTES, 'UTF-8') ?></td>
      <td><?= htmlspecialchars($inc['prioridad'], ENT_QUOTES, 'UTF-8') ?></td>
      <td><?= htmlspecialchars($inc['estado'],    ENT_QUOTES, 'UTF-8') ?></td>
    </tr>
  <?php endforeach ?>
  </tbody>
</table>

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:

1
2
3
4
<?php foreach ($incidencia as $campo => $valor): ?>
  <li><strong><?= htmlspecialchars($campo, ENT_QUOTES, 'UTF-8') ?>:</strong>
      <?= htmlspecialchars($valor, ENT_QUOTES, 'UTF-8') ?></li>
<?php endforeach ?>

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
1
2
3
4
5
6
7
$incidencias    = [/* ... tres elementos ... */];
$total          = count($incidencias);   ## 3
var_dump(empty($incidencias));           ## bool(false)

$ejemplo_vacio = [];
count($ejemplo_vacio);                   ## 0
var_dump(empty($ejemplo_vacio));         ## bool(true)

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:

$total_incidencias = count($incidencias);
?>
<h1>Listado de incidencias</h1>

<p>Total: <?= $total_incidencias ?> incidencias.</p>

<table>
  <!-- ... -->
</table>
<p>Fin del listado (<?= $total_incidencias ?>).</p>

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.