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() (visto en el apunte anterior).

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 catálogo de libros:

$libros = [
    [
        'isbn'   => '978-84-376-0494-7',
        'titulo' => 'Cien años de soledad',
        'autor'  => 'Gabriel García Márquez',
        'anio'   => 1967,
    ],
    [
        'isbn'   => '978-84-204-8305-3',
        'titulo' => 'La sombra del viento',
        'autor'  => 'Carlos Ruiz Zafón',
        'anio'   => 2001,
    ],
];

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

echo $libros[0]['titulo'];   ## → Cien años de soledad
echo $libros[1]['autor'];    ## → Carlos Ruiz Zafón

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) ?>
  </li>
<?php endforeach ?>
</ul>

Compara con la forma clásica:

<?php foreach ($prioridades as $p) { ?>
  <li><?= htmlspecialchars($p) ?></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>ISBN</th><th>Título</th><th>Autor</th><th>Año</th></tr>
  </thead>
  <tbody>
  <?php foreach ($libros as $libro): ?>
    <tr>
      <td><?= htmlspecialchars($libro['isbn']) ?></td>
      <td><?= htmlspecialchars($libro['titulo']) ?></td>
      <td><?= htmlspecialchars($libro['autor']) ?></td>
      <td><?= $libro['anio'] ?></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 un libro sin nombrarlos uno a uno:

1
2
3
4
<?php foreach ($libro as $campo => $valor): ?>
  <li><strong><?= htmlspecialchars($campo) ?>:</strong>
      <?= htmlspecialchars($valor) ?></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 otros bloques de sintaxis alternativa como endif, endwhile, etc.

Contar elementos: count()

count($array) devuelve el número de elementos del array (entero):

1
2
3
4
5
$libros = [/* ... tres elementos ... */];
$total  = count($libros);              ## 3

$ejemplo_vacio = [];
count($ejemplo_vacio);                 ## 0

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_libros = count($libros);
?>
<h1>Catálogo</h1>

<p>Total: <?= $total_libros ?> libros.</p>

<table>
  <!-- ... -->
</table>
<p>Fin del catálogo (<?= $total_libros ?>).</p>

Así el código queda más claro: si mañana cambias el cálculo del total (por ejemplo, para contar solo los libros publicados después de 2000), solo tocas una línea.

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.

Para detectar listas vacías existe empty()

Para distinguir si una lista tiene contenido o está vacía existe la función empty($array), que devuelve true cuando el array no tiene elementos (o cuando la variable no existe). Suele combinarse con if para mostrar un mensaje alternativo cuando no hay datos que listar.