Skip to content

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'];     // Pluma

Agregar, 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 clave

Comprobar 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; // 255

Otras 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 id

Ordenar ​

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 ​

  1. Dado $palabras = ['sol', 'luna', 'estrella', 'mar', 'cometa'], obtén las palabras con más de 3 letras en mayúsculas.
  2. Dado un array de alumnos con nombre y calificacion, ordénalos de mayor a menor calificación y muestra el top 3.
  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[] = x agrega; unset() elimina; array_values() reindexa.
  • isset falla con valores null; array_key_exists no.
  • Transforma con array_map, filtra con array_filter, acumula con array_reduce.
  • array_column extrae columnas de datos tipo tabla.
  • sort, asort, ksort y usort modifican el array original.
  • Usa destructuring [$a, $b] = ... para código más limpio.

Academia Web — aprende, copia y construye.