Si tienes cinco notas, podrías crear $nota1, $nota2… $nota5. Pero si son cuarenta, o si no sabes cuántas serán, eso no escala. Un arreglo guarda muchos valores bajo un solo nombre. Hay dos formas de ubicar cada valor: por su posición (0, 1, 2…) o por una clave con nombre ("nombre", "precio").

Arreglos con posiciones

<?php
$notas = [5.5, 6.0, 3.8, 4.5, 6.8];
 
echo $notas[0] . "\n";
echo $notas[4] . "\n";
echo count($notas) . " notas\n";
5.5
6.8
5 notas

Un arreglo con posiciones

 $notas = [5.5, 6.0, 3.8, 4.5, 6.8];

  posición:    0      1      2      3      4
             +------+------+------+------+------+
  valor:     | 5.5  | 6.0  | 3.8  | 4.5  | 6.8  |
             +------+------+------+------+------+

  $notas[0] -> 5.5       $notas[4] -> 6.8       count($notas) -> 5
  • Los valores van entre corchetes [ ], separados por comas.
  • La primera posición es 0, igual que en C. La última es count($notas) - 1.
  • count() dice cuántos elementos tiene.
  • Para agregar al final se escribe [] vacío: $notas[] = 7.0;. El arreglo crece solo; no tiene tamaño fijo.

Incorrecto: pedir una posición que no existe

<?php
$ciudades = ["Punta Arenas", "Puerto Natales", "Porvenir"];
echo $ciudades[3];
PHP Warning:  Undefined array key 3 in /home/ana/prueba.php on line 3

Tres elementos ocupan las posiciones 0, 1 y 2. La posición 3 no existe.

Arreglos con claves

En $persona[2], el número no dice nada: ¿qué había en la posición 2? Un arreglo asociativo usa nombres en vez de números. Es la forma de guardar un registro: todos los datos de una persona o de un producto.

<?php
$producto = [
    "nombre" => "Cuaderno",
    "precio" => 2490,
    "stock" => 40,
];
 
echo $producto["nombre"] . "\n";
echo $producto["precio"] . "\n";
 
$producto["precio"] = 2990;
echo $producto["precio"] . "\n";
Cuaderno
2490
2990

Un arreglo asociativo

 $producto
 +----------+------------+
 | clave    | valor      |
 +----------+------------+
 | "nombre" | "Cuaderno" |
 | "precio" | 2490       |
 | "stock"  | 40         |
 +----------+------------+

 $producto["precio"] -> 2490
  • La clave (a la izquierda de =>) es un texto entre comillas.
  • El valor (a la derecha) puede ser de cualquier tipo.
  • Asignar a una clave la cambia si existe, y la crea si no existe.

Ya conoces uno: los datos de un formulario

Cuando se envía un formulario con los campos nombre y correo, PHP recibe un arreglo asociativo con esas claves: $_POST["nombre"] y $_POST["correo"]. Se ve en la Parte 6.

¿Existe la clave?

Incorrecto: leer una clave que puede no estar

<?php
$producto = ["nombre" => "Cuaderno", "precio" => 2490];
echo "Stock: " . $producto["stock"] . "\n";
PHP Warning:  Undefined array key "stock" in /home/ana/prueba.php on line 3
Stock: 

Correcto: preguntar con isset, o dar un valor con ??

<?php
$producto = ["nombre" => "Cuaderno", "precio" => 2490];
 
if (isset($producto["stock"])) {
    echo "Stock: " . $producto["stock"] . "\n";
} else {
    echo "Sin información de stock\n";
}
 
echo "Stock: " . ($producto["stock"] ?? 0) . "\n";
Sin información de stock
Stock: 0

isset() responde true o false. ?? es el mismo de la Parte 3: da un valor por defecto si la clave no está.

Recorrer: foreach

foreach pasa por cada elemento del arreglo, de principio a fin, y en cada vuelta deja el valor en una variable. No hay que manejar posiciones ni count().

Anatomía de un foreach

 foreach ($notas as $nota) {
          ---+--    --+--
             |        `- en cada vuelta, el elemento actual (en singular)
             `---------- el arreglo que se recorre (en plural)
     echo $nota;
 }
<?php
$notas = [5.5, 6.0, 3.8, 4.5, 6.8];
$suma = 0;
$rojas = 0;
 
foreach ($notas as $nota) {
    $suma += $nota;
    if ($nota < 4.0) {
        $rojas++;
    }
}
 
echo "Promedio: " . round($suma / count($notas), 1) . "\n";
echo "Notas rojas: $rojas\n";
Promedio: 5.3
Notas rojas: 1

Si además necesitas la clave (o la posición), se pide con =>:

<?php
$producto = ["nombre" => "Cuaderno", "precio" => 2490, "stock" => 40];
 
foreach ($producto as $clave => $valor) {
    echo "$clave: $valor\n";
}
nombre: Cuaderno
precio: 2490
stock: 40

Incorrecto: recorrer con for y un límite escrito a mano

<?php
for ($i = 0; $i < 5; $i++) {
    echo $notas[$i];
}

Si mañana el arreglo tiene 4 notas, aparece un Warning; si tiene 6, la última no se muestra.

Correcto: foreach, con plural y singular

foreach ($notas as $nota) funciona con cualquier cantidad de elementos, incluso con cero. Y se lee de corrido: “para cada nota de las notas”.

Generar HTML

Igual que el for en Ciclos que generan HTML, foreach tiene su forma con dos puntos para las vistas:

<?php $ciudades = ["Punta Arenas", "Puerto Natales", "Porvenir"]; ?>
 
<ul class="list-disc list-inside">
  <?php foreach ($ciudades as $ciudad): ?>
    <li><?= $ciudad ?></li>
  <?php endforeach; ?>
</ul>

Ver el contenido: print_r

echo no sirve para un arreglo completo: imprime la palabra Array y un Warning. Para revisar qué tiene, se usa print_r():

<?php
$producto = ["nombre" => "Cuaderno", "precio" => 2490];
print_r($producto);
Array
(
    [nombre] => Cuaderno
    [precio] => 2490
)

En el navegador, envuélvelo en <pre> para que conserve los saltos de línea: <pre><?php print_r($producto); ?></pre>. Es para buscar errores; en la página terminada no queda ninguno.

Pruébalo

  • Crea un arreglo con cinco notas, imprime la primera y la última
  • Agrega una sexta nota con [] y comprueba que count() cambió
  • Calcula el promedio recorriendo con foreach
  • Crea un arreglo asociativo con tus datos (nombre, carrera, ciudad) y recórrelo con $clave => $valor
  • Error provocado: lee una clave que no existe, con y sin ??
  • Error provocado: haz echo de un arreglo completo y lee el Warning

Errores comunes

SíntomaCausaSolución
Undefined array key 5Pediste una posición que no existe (la última es count - 1)Recorre con foreach, o revisa el índice
Undefined array key "stock"La clave no existe, o está escrita distinto ("Stock")Revisa con print_r; usa isset o ??
Undefined constant "nombre"La clave se escribió sin comillas: $p[nombre]$p["nombre"]
Array to string conversion y se imprime Arrayecho de un arreglo completoprint_r() para revisar, foreach para mostrar
foreach() argument must be of type array|objectLa variable que recorres no es un arreglo (o no existe)Revisa con var_dump() qué tiene

Checkpoint

Intenta responder antes de desplegar cada pregunta.