Un array asociativo guarda cada valor bajo una clave que eliges tú, escrita como key => value: $user = ['name' => 'Ada', 'age' => 36];. Lee un valor con $user['name'], y añade o cambia uno asignándolo a su clave: $user['email'] = 'ada@example.com';.
En otros lenguajes la misma estructura se llama diccionario, mapa o hash. En PHP es un array normal cuyas claves son cadenas en lugar de 0, 1, 2.
Añadir, cambiar y eliminar pares
Asignar a una clave que no existe la añade al final. Asignar a una clave que ya existe sustituye su valor y mantiene su posición. unset() elimina un par.
array_push() no sirve aquí: solo puede añadir valores con claves numéricas. Para añadir varios pares a la vez, usa array_merge($stock, $more), donde ganan los valores nuevos, o $stock + $more, donde las claves existentes conservan sus valores; la página de array_merge compara las dos.
Recorrer claves y valores
foreach ($array as $key => $value) recorre los pares en el orden en que se añadieron. Omite $key => cuando solo necesites los valores.
Obtener todas las claves o todos los valores
array_keys() devuelve las claves como una lista simple y array_values() devuelve los valores, ambos reindexados desde 0. Dale a array_keys() un segundo argumento y devuelve solo las claves que contienen ese valor, que es como encuentras todas las claves de un valor.
Para una sola clave, array_search() devuelve la primera coincidencia, o false si no hay ninguna. La página de array_search explica por qué debes comparar ese resultado con !== false.
Comprobar si existe una clave
isset($arr['key']) es la comprobación habitual y la más rápida, pero devuelve false cuando la clave existe y contiene null. array_key_exists('key', $arr) devuelve true en ese caso. Para leer con un valor por defecto, el operador ?? hace las dos cosas a la vez.
Ordenar por clave o por valor
ksort() ordena por clave y asort() por valor, y las dos mantienen cada clave unida a su valor. krsort() y arsort() ordenan al revés. No uses sort() con un array asociativo: descarta las claves y renumera desde 0.
Todas ordenan en el sitio y devuelven true, así que $sorted = ksort($arr) te da true, no un array. Los órdenes personalizados usan uasort() y uksort().
Invertir, contar y convertir a JSON
Con datos clave valor aparecen una y otra vez unas cuantas funciones de una línea: array_flip() intercambia claves y valores, array_count_values() cuenta cuántas veces aparece cada valor y json_encode() convierte el array en un objeto JSON.
Error frecuente: leer una clave que no existe
Leer una clave que falta devuelve null, pero tu PHP además imprime un warning:
<?php
$user = ['name' => 'Ada'];
echo $user['phone'];
Warning: Undefined array key "phone" in /var/www/html/index.php on line 3
Dale a la lectura un valor por defecto con ??, que nunca avisa, o comprueba antes con isset() cuando el caso de la clave ausente necesite su propia rama.
Dentro de una cadena entre comillas dobles, envuelve la búsqueda entre llaves, "{$user['email']}". Sin ellas, PHP solo acepta la forma sin comillas "$user[email]", en la que es fácil equivocarse.
Preguntas frecuentes
¿Cómo creo un array asociativo en PHP?
Escribe cada par como key => value dentro de corchetes: $prices = ['apple' => 1.2, 'pear' => 0.9];. Lee un valor con $prices['apple'].
¿Cómo ordeno un array asociativo por clave en PHP?
Llama a ksort($arr); para ordenar de la A a la Z o a krsort($arr); para ordenar de la Z a la A. Las dos ordenan en el sitio, mantienen cada valor con su clave y devuelven true, no el array ordenado.
¿Cómo recorro un array asociativo en PHP?
Usa foreach con las dos variables: foreach ($prices as $fruit => $price) { echo "$fruit: $price\n"; }. Los pares salen en el orden en que se añadieron.
¿Cómo obtengo todas las claves de un array asociativo?
array_keys($arr) devuelve las claves como un array indexado, y array_values($arr) devuelve los valores. array_keys($arr, $value) devuelve solo las claves cuyo valor es igual a $value.
¿Un array asociativo de PHP conserva el orden de inserción?
Sí. Los arrays de PHP son mapas ordenados, así que foreach, print_r y json_encode ven los pares en el orden en que los insertaste, hasta que ordenas el array con ksort(), asort() o una función similar.