Arrays

Una sola estructura que hace de lista y de diccionario

Marco González Luengo

Tabla de contenidos
  1. Como lista
  2. Como diccionario
  3. Recorrer clave y valor
  4. Claves que no existen
  5. Borrar elementos
  6. Primero y último
  7. Para practicar

En Python, list y dict son tipos distintos. En PHP son lo mismo: el array. Es cómodo, porque todo se hace con una sola estructura, y peligroso por la misma razón.

Como lista

Si no le pones claves, PHP numera los elementos desde 0:

<?php
$notas = [6.0, 5.5, 4.8];

$notas[] = 7.0;                // agrega al final
echo count($notas), PHP_EOL;   // 4
echo $notas[0], PHP_EOL;       // 6

print_r($notas);

Como diccionario

Con clave => valor, el array funciona como un diccionario (en PHP se le llama array asociativo):

<?php
$stock = [
    "arroz" => 12,
    "azúcar" => 3,
];

echo $stock["arroz"], PHP_EOL;   // 12

$stock["fideos"] = 8;            // agrega una clave nueva
$stock["azúcar"] = 5;            // cambia el valor de una clave existente

print_r($stock);

A simple vista nada distingue una lista de un diccionario: hay que leer el código que lo llena.

Recorrer clave y valor

foreach puede entregar la clave y el valor a la vez, como .items() en Python:

<?php
$sala = [
    'lunes' => 'A202',
    'martes' => 'C104',
    'miercoles' => 'F102',
    'jueves' => 'C304',
    'viernes' => 'A201',
    'sabado' => null,
    'domingo' => null,
];

foreach ($sala as $dia => $salon) {
    if ($salon) {
        echo "El {$dia} toca en la sala {$salon}.", PHP_EOL;
    } else {
        echo "El {$dia} no hay clases. Obvio.", PHP_EOL;
    }
}

Con una lista también funciona: la clave es la posición (0, 1, 2...).

Claves que no existen

Aquí está la trampa más traicionera para quien viene de Python. Si pides una clave que no existe, PHP no lanza un error: muestra un warning, te devuelve null y sigue como si nada.

<?php
$sala = [
    'lunes' => 'A202',
    'jueves' => 'C304',
];

echo $sala['jueves'], PHP_EOL;  // existe: C304
echo $sala[3], PHP_EOL;         // no hay clave 3: Warning
echo $sala['marzo'], PHP_EOL;   // tampoco existe: Warning
var_dump($sala['marzo']);       // y lo que devuelve es NULL
echo "...y el programa sigue como si nada.", PHP_EOL;

Ese null puede viajar por todo el programa y explotar muy lejos de donde se originó. Dos formas de protegerse:

<?php
$stock = ["arroz" => 12];

// 1. Preguntar antes si la clave existe
if (array_key_exists("azúcar", $stock)) {
    echo $stock["azúcar"], PHP_EOL;
} else {
    echo "No hay azúcar registrada", PHP_EOL;
}

// 2. Usar ?? para dar un valor por defecto
echo $stock["azúcar"] ?? 0, PHP_EOL;  // 0, sin warning

También existe isset, pero tiene una trampa con los valores null; la vemos en Diccionarios.

Borrar elementos

unset borra un elemento. Ojo: en una lista, las posiciones no se reordenan:

<?php
$letras = ["a", "b", "c"];
unset($letras[1]);

print_r($letras);  // quedan las claves 0 y 2

Si después haces $letras[1], te llevas un warning. Si necesitas volver a numerar, existe array_values.

Primero y último

Desde PHP 8.5 existen array_first y array_last. Si el array está vacío devuelven null, sin warnings:

<?php
$eventos = ["inicio", "pausa", "fin"];

var_dump(array_first($eventos));  // "inicio"
var_dump(array_last($eventos));   // "fin"
var_dump(array_last([]));         // NULL

Para practicar

Escribe en PHP estos programas que ya sabrías hacer en Python:

  1. Recorrer un diccionario imprimiendo cada clave y su valor.
  2. Contar cuántas veces aparece cada palabra en un texto. Te puede servir explode para separar el texto en palabras.
<?php
declare(strict_types=1);

$texto = "el perro y el gato y el ratón";

// Escribe tu solución aquí y presiona ▶ Ejecutar


Sigue con Funciones.