Tema
Arrays a fondo
Los arrays son la estructura de datos estrella de PHP: listas de productos, datos de un formulario, filas de una base de datos, configuración... todo son arrays. En esta lección aprenderás a crearlos, recorrerlos, transformarlos, ordenarlos y buscar en ellos como un profesional.
Concepto
Un array es como un archivero: tiene cajones (las claves) y en cada cajón guardas algo (el valor). PHP tiene un solo tipo de array que sirve para todo:
- Indexado: los cajones se numeran solos (0, 1, 2...). Como una lista.
- Asociativo: tú nombras los cajones (
'nombre','email'). Como un diccionario o un objeto JSON. - Multidimensional: cajones que contienen otros archiveros.
Crear y acceder
php
<?php
// Indexado
$colores = ['rojo', 'verde', 'azul'];
echo $colores[0]; // rojo (¡el primer índice es 0!)
echo $colores[2]; // azul
echo count($colores); // 3
// Asociativo
$cliente = [
'nombre' => 'Laura Méndez',
'email' => 'laura@correo.com',
'edad' => 34,
'activo' => true,
];
echo $cliente['email']; // laura@correo.com
// Multidimensional
$pedido = [
'folio' => 'A-1024',
'cliente' => $cliente,
'productos' => [
['sku' => 'P01', 'nombre' => 'Libreta', 'precio' => 45, 'cantidad' => 3],
['sku' => 'P02', 'nombre' => 'Pluma', 'precio' => 12, 'cantidad' => 10],
],
];
echo $pedido['cliente']['nombre']; // Laura Méndez
echo $pedido['productos'][1]['nombre']; // PlumaAgregar, modificar y eliminar
php
<?php
$tareas = ['Comprar pan'];
$tareas[] = 'Pagar luz'; // Agrega al final
array_push($tareas, 'Llamar a mamá'); // Igual, varias a la vez
array_unshift($tareas, 'Despertar'); // Agrega al inicio
$tareas[1] = 'Comprar pan integral'; // Modifica
$ultima = array_pop($tareas); // Quita y devuelve la última
$primera = array_shift($tareas); // Quita y devuelve la primera
unset($tareas[0]); // Elimina por índice (¡deja un hueco en los índices!)
$tareas = array_values($tareas); // Reindexa: 0, 1, 2...
// Asociativos
$cliente = ['nombre' => 'Laura'];
$cliente['telefono'] = '555-123-4567'; // Agrega clave
unset($cliente['telefono']); // Elimina claveComprobar claves y valores
php
<?php
$config = ['modo' => 'produccion', 'debug' => null];
var_dump(isset($config['modo'])); // true
var_dump(isset($config['debug'])); // false ← existe pero es null
var_dump(array_key_exists('debug', $config));// true ← existe, aunque sea null
$roles = ['admin', 'editor', 'autor'];
var_dump(in_array('editor', $roles, true)); // true (true = comparación estricta)
var_dump(array_search('autor', $roles)); // int(2) → posición, o false
// Acceso seguro con valor por defecto
$idioma = $config['idioma'] ?? 'es';Error común
array_search devuelve 0 si el elemento está en la primera posición, y 0 es "falso". Compara siempre con !== false: if (array_search('admin', $roles) !== false).
Las funciones que usarás todos los días
Transformar: array_map
Aplica una función a cada elemento y devuelve un nuevo array.
php
<?php
$precios = [100, 250, 80];
$conIva = array_map(fn($p) => round($p * 1.16, 2), $precios);
// [116, 290, 92.8]
$productos = [
['nombre' => 'Libreta', 'precio' => 45],
['nombre' => 'Pluma', 'precio' => 12],
];
$nombres = array_map(fn($p) => $p['nombre'], $productos);
// ['Libreta', 'Pluma']Filtrar: array_filter
Se queda con los elementos para los que la función devuelve true. Conserva las claves originales.
php
<?php
$edades = [12, 25, 17, 40, 8];
$adultos = array_filter($edades, fn($e) => $e >= 18);
// [1 => 25, 3 => 40] ← las claves se conservan
$adultos = array_values($adultos); // [25, 40]
// Sin función: elimina valores "falsos" ('' , 0, null, false)
$datos = ['Ana', '', null, 'Luis', 0];
print_r(array_filter($datos)); // [0 => 'Ana', 3 => 'Luis']
// Filtrar por clave
$usuario = ['nombre' => 'Ana', 'password' => '123', 'email' => 'a@a.com'];
$publico = array_filter($usuario, fn($k) => $k !== 'password', ARRAY_FILTER_USE_KEY);Reducir: array_reduce
Convierte un array en un solo valor (un total, por ejemplo).
php
<?php
$carrito = [
['producto' => 'Libreta', 'precio' => 45, 'cantidad' => 3],
['producto' => 'Pluma', 'precio' => 12, 'cantidad' => 10],
];
$total = array_reduce(
$carrito,
fn($acumulado, $item) => $acumulado + $item['precio'] * $item['cantidad'],
0 // Valor inicial del acumulador
);
echo $total; // 255Otras imprescindibles
php
<?php
$numeros = [5, 3, 8, 1];
array_sum($numeros); // 17
array_product($numeros); // 120
max($numeros); // 8
min($numeros); // 1
array_slice($numeros, 1, 2); // [3, 8] → porción sin modificar el original
array_reverse($numeros); // [1, 8, 3, 5]
array_unique([1, 1, 2, 3, 3]);// [1, 2, 3] (conserva claves)
array_merge(['a' => 1], ['b' => 2], ['a' => 9]); // ['a' => 9, 'b' => 2]
[...[1, 2], ...[3, 4]]; // [1, 2, 3, 4] (spread)
array_keys(['x' => 1, 'y' => 2]); // ['x', 'y']
array_values(['x' => 1, 'y' => 2]); // [1, 2]
array_combine(['a', 'b'], [1, 2]); // ['a' => 1, 'b' => 2]
array_flip(['a' => 1, 'b' => 2]); // [1 => 'a', 2 => 'b']
range(1, 5); // [1, 2, 3, 4, 5]
range('a', 'e'); // ['a', 'b', 'c', 'd', 'e']
array_fill(0, 3, 'x'); // ['x', 'x', 'x']
array_chunk([1,2,3,4,5], 2); // [[1,2], [3,4], [5]] → útil para cuadrículas
// Convertir string ↔ array
explode(',', 'rojo,verde,azul'); // ['rojo', 'verde', 'azul']
implode(', ', ['a', 'b', 'c']); // 'a, b, c'array_column: oro puro con datos de base de datos
php
<?php
$usuarios = [
['id' => 10, 'nombre' => 'Ana', 'rol' => 'admin'],
['id' => 20, 'nombre' => 'Luis', 'rol' => 'editor'],
['id' => 30, 'nombre' => 'Eva', 'rol' => 'editor'],
];
array_column($usuarios, 'nombre'); // ['Ana', 'Luis', 'Eva']
array_column($usuarios, 'nombre', 'id'); // [10 => 'Ana', 20 => 'Luis', 30 => 'Eva']
array_column($usuarios, null, 'id'); // Re-indexa las filas completas por idOrdenar
Las funciones de ordenamiento modifican el array original y devuelven true.
php
<?php
$nums = [5, 3, 8, 1];
sort($nums); // [1, 3, 5, 8] ascendente, reindexa
rsort($nums); // [8, 5, 3, 1] descendente
$precios = ['café' => 35, 'té' => 28, 'jugo' => 40];
asort($precios); // Por valor, conserva claves: té, café, jugo
arsort($precios); // Por valor descendente
ksort($precios); // Por clave: café, jugo, té
krsort($precios); // Por clave descendente
// Orden personalizado con usort + <=>
$productos = [
['nombre' => 'Monitor', 'precio' => 3200],
['nombre' => 'Mouse', 'precio' => 320],
['nombre' => 'Teclado', 'precio' => 650],
];
usort($productos, fn($a, $b) => $a['precio'] <=> $b['precio']);
// Mouse, Teclado, Monitor
// Por dos criterios: rol ascendente y luego nombre
usort($usuarios, fn($a, $b) => [$a['rol'], $a['nombre']] <=> [$b['rol'], $b['nombre']]);Error común
Escribir $ordenado = sort($nums);. sort devuelve true, no el array ordenado. El array ordenado es el propio $nums.
Destructuring
php
<?php
[$a, $b] = [10, 20];
[$a, $b] = [$b, $a]; // Intercambia: $a = 20, $b = 10
['nombre' => $n, 'email' => $m] = ['nombre' => 'Ana', 'email' => 'ana@x.com'];
echo "$n - $m";
// Útil con funciones que devuelven varios valores
function minMax(array $nums): array
{
return [min($nums), max($nums)];
}
[$menor, $mayor] = minMax([4, 9, 1]);Ejemplo completo: reporte de ventas
php
<?php
declare(strict_types=1);
$ventas = [
['vendedor' => 'Ana', 'producto' => 'Laptop', 'monto' => 18500, 'mes' => 'enero'],
['vendedor' => 'Luis', 'producto' => 'Mouse', 'monto' => 350, 'mes' => 'enero'],
['vendedor' => 'Ana', 'producto' => 'Monitor','monto' => 4200, 'mes' => 'febrero'],
['vendedor' => 'Eva', 'producto' => 'Laptop', 'monto' => 19000, 'mes' => 'febrero'],
['vendedor' => 'Luis', 'producto' => 'Laptop', 'monto' => 17800, 'mes' => 'febrero'],
];
// 1. Total general
$total = array_sum(array_column($ventas, 'monto'));
// 2. Total por vendedor (agrupar)
$porVendedor = [];
foreach ($ventas as $v) {
$porVendedor[$v['vendedor']] = ($porVendedor[$v['vendedor']] ?? 0) + $v['monto'];
}
arsort($porVendedor); // El que más vendió primero
// 3. Ventas grandes (más de 10 000)
$grandes = array_values(array_filter($ventas, fn($v) => $v['monto'] > 10000));
// 4. Productos distintos vendidos
$productos = array_values(array_unique(array_column($ventas, 'producto')));
?>
<h2>Reporte de ventas</h2>
<p>Total: $<?= number_format($total, 2) ?></p>
<h3>Ranking de vendedores</h3>
<ol>
<?php foreach ($porVendedor as $vendedor => $monto): ?>
<li><?= htmlspecialchars($vendedor) ?>: $<?= number_format($monto, 2) ?></li>
<?php endforeach; ?>
</ol>
<p>Ventas mayores a $10,000: <?= count($grandes) ?></p>
<p>Productos vendidos: <?= implode(', ', $productos) ?></p>Buena práctica
Encadena funciones de arrays (array_filter → array_map → array_sum) en lugar de escribir bucles largos con muchas variables temporales. Pero si la cadena se vuelve ilegible, un foreach claro es mejor que una línea ingeniosa.
Ejercicios
- Dado
$palabras = ['sol', 'luna', 'estrella', 'mar', 'cometa'], obtén las palabras con más de 3 letras en mayúsculas. - Dado un array de alumnos con
nombreycalificacion, ordénalos de mayor a menor calificación y muestra el top 3. - Agrupa este array por categoría:
[['p' => 'Manzana', 'cat' => 'fruta'], ['p' => 'Zanahoria', 'cat' => 'verdura'], ['p' => 'Pera', 'cat' => 'fruta']]→['fruta' => ['Manzana', 'Pera'], 'verdura' => ['Zanahoria']].
Ver solución
php
<?php
$palabras = ['sol', 'luna', 'estrella', 'mar', 'cometa'];
$resultado = array_values(array_map(
fn($p) => strtoupper($p),
array_filter($palabras, fn($p) => strlen($p) > 3)
));
print_r($resultado); // ['LUNA', 'ESTRELLA', 'COMETA']php
<?php
$alumnos = [
['nombre' => 'Ana', 'calificacion' => 8.7],
['nombre' => 'Beto', 'calificacion' => 9.5],
['nombre' => 'Carla', 'calificacion' => 7.2],
['nombre' => 'Dani', 'calificacion' => 9.9],
];
usort($alumnos, fn($a, $b) => $b['calificacion'] <=> $a['calificacion']);
$top3 = array_slice($alumnos, 0, 3);
foreach ($top3 as $i => $al) {
echo ($i + 1) . ". {$al['nombre']} ({$al['calificacion']})<br>";
}
// 1. Dani (9.9) 2. Beto (9.5) 3. Ana (8.7)php
<?php
$items = [
['p' => 'Manzana', 'cat' => 'fruta'],
['p' => 'Zanahoria', 'cat' => 'verdura'],
['p' => 'Pera', 'cat' => 'fruta'],
];
$agrupado = [];
foreach ($items as $item) {
$agrupado[$item['cat']][] = $item['p']; // Crea el sub-array si no existe
}
print_r($agrupado);Resumen
- PHP tiene un único tipo de array: indexado, asociativo o multidimensional.
$arr[] = xagrega;unset()elimina;array_values()reindexa.issetfalla con valores null;array_key_existsno.- Transforma con
array_map, filtra conarray_filter, acumula conarray_reduce. array_columnextrae columnas de datos tipo tabla.sort,asort,ksortyusortmodifican el array original.- Usa destructuring
[$a, $b] = ...para código más limpio.