Saltar al contenido principal
Representación visual de un array en PHP con funciones map, filter y reduce.

Domina los arrays en PHP: map, filter, reduce y más

Los arrays son quizá la estructura de datos más usada en PHP. Desde listar productos de una tienda, filtrar resultados de una base de datos, ordenar usuarios o agrupar estadísticas, casi todo pasa por un array en algún momento.

En este post te voy a enseñar las funciones que más uso para transformar, filtrar, combinar y ordenar arrays, con ejemplos reales que puedes copiar y adaptar directamente a tus proyectos.

Transformar datos con array_map()

array_map() aplica una función a cada elemento de un array y devuelve un nuevo array con los resultados. Es ideal cuando necesitas transformar una colección sin modificar la original.

$precios = [100, 250, 80, 430];

$conIva = array_map(function ($precio) {
    return $precio * 1.16;
}, $precios);

print_r($conIva);
// [116, 290, 92.8, 498.8]

También puedes usar funciones con nombre o arrow functions de PHP 7.4+:

$nombres = ["juan", "maria", "pedro"];
$capitalizados = array_map('ucfirst', $nombres);

print_r($capitalizados);
// ["Juan", "Maria", "Pedro"]

Caso de uso real: Formatear una lista de precios para mostrar en una tabla.

$productos = [
    ['nombre' => 'Mouse', 'precio' => 350],
    ['nombre' => 'Teclado', 'precio' => 750],
    ['nombre' => 'Monitor', 'precio' => 3200],
];

$preciosFormateados = array_map(function ($producto) {
    return [
        'nombre' => $producto['nombre'],
        'precio' => '$' . number_format($producto['precio'], 2),
    ];
}, $productos);

Filtrar elementos con array_filter()

array_filter() devuelve un nuevo array con solo los elementos que cumplen una condición. La clave original se conserva, así que si necesitas índices consecutivos, recuerda usar array_values().

$numeros = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

$pares = array_filter($numeros, function ($numero) {
    return $numero % 2 === 0;
});

print_r($pares);
// [1 => 2, 3 => 4, 5 => 6, 7 => 8, 9 => 10]

$pares = array_values($pares);
// [2, 4, 6, 8, 10]

Ejemplo práctico: Filtrar productos que tienen stock disponible.

$productos = [
    ['nombre' => 'Mouse', 'stock' => 12],
    ['nombre' => 'Teclado', 'stock' => 0],
    ['nombre' => 'Monitor', 'stock' => 3],
];

$disponibles = array_filter($productos, function ($producto) {
    return $producto['stock'] > 0;
});

Si omites la función de callback, array_filter() elimina los valores que son “falsos” (false, 0, "", null, []):

$valores = [0, 1, "", "hola", null, [], true];
$limpio = array_filter($valores);

print_r($limpio);
// [1 => 1, 3 => "hola", 6 => true]

Reducir arrays con array_reduce()

array_reduce() convierte un array en un único valor acumulado. Es perfecto para sumar totales, construir strings, contar elementos o transformar una lista en una estructura diferente.

$ventas = [120, 340, 560, 90];

$total = array_reduce($ventas, function ($acumulador, $venta) {
    return $acumulador + $venta;
}, 0);

echo $total; // 1110

Caso de uso real: Calcular el total de un carrito de compras con productos y cantidades.

$carrito = [
    ['producto' => 'Mouse', 'precio' => 350, 'cantidad' => 2],
    ['producto' => 'Teclado', 'precio' => 750, 'cantidad' => 1],
];

$total = array_reduce($carrito, function ($acumulador, $item) {
    return $acumulador + ($item['precio'] * $item['cantidad']);
}, 0);

echo $total; // 1450

También puedes usar array_reduce() para construir estructuras más complejas:

$usuarios = [
    ['nombre' => 'Ana', 'rol' => 'admin'],
    ['nombre' => 'Luis', 'rol' => 'editor'],
    ['nombre' => 'Sofía', 'rol' => 'admin'],
];

$porRol = array_reduce($usuarios, function ($acumulador, $usuario) {
    $acumulador[$usuario['rol']][] = $usuario['nombre'];
    return $acumulador;
}, []);

print_r($porRol);
// [
//   "admin" => ["Ana", "Sofía"],
//   "editor" => ["Luis"]
// ]

Combinar arrays con array_merge()

array_merge() une dos o más arrays en uno solo. Si las claves son numéricas, se reindexan automáticamente. Si son strings, los valores posteriores sobrescriben a los anteriores.

$frutas = ["manzana", "pera"];
$verduras = ["zanahoria", "espinaca"];

$alimentos = array_merge($frutas, $verduras);

print_r($alimentos);
// ["manzana", "pera", "zanahoria", "espinaca"]

Ejemplo práctico: Unir configuraciones por defecto con configuraciones personalizadas del usuario.

$defaultConfig = [
    'theme' => 'light',
    'lang' => 'es',
    'notifications' => true,
];

$userConfig = [
    'theme' => 'dark',
    'lang' => 'en',
];

$config = array_merge($defaultConfig, $userConfig);

print_r($config);
// ['theme' => 'dark', 'lang' => 'en', 'notifications' => true]

Eliminar duplicados con array_unique()

array_unique() elimina los valores duplicados de un array, conservando la primera aparición de cada valor.

$tags = ["php", "mysql", "php", "linux", "mysql", "bash"];

$tagsUnicos = array_unique($tags);

print_r($tagsUnicos);
// ["php", "mysql", "linux", "bash"]

Caso real: Limpiar una lista de correos antes de enviar una newsletter.

$emails = [
    "juan@email.com",
    "maria@email.com",
    "juan@email.com",
    "pedro@email.com",
];

$emailsUnicos = array_values(array_unique($emails));
// ["juan@email.com", "maria@email.com", "pedro@email.com"]

Ordenar arrays con sort() y usort()

PHP ofrece muchas funciones para ordenar arrays. Las más comunes son:

  • sort() - Ordena un array indexado de menor a mayor.
  • rsort() - Ordena un array indexado de mayor a menor.
  • asort() / arsort() - Ordenan arrays asociativos preservando las claves.
  • ksort() / krsort() - Ordenan arrays asociativos por sus claves.
  • usort() - Ordena con una función de comparación personalizada.
$numeros = [5, 2, 8, 1, 9];
sort($numeros);

print_r($numeros);
// [1, 2, 5, 8, 9]

Ejemplo con array asociativo:

$usuarios = [
    ['nombre' => 'Carlos', 'edad' => 30],
    ['nombre' => 'Ana', 'edad' => 25],
    ['nombre' => 'Luis', 'edad' => 35],
];

usort($usuarios, function ($a, $b) {
    return $a['edad'] <=> $b['edad'];
});

print_r($usuarios);
// Ana (25), Carlos (30), Luis (35)

El operador spaceship <=> compara dos valores y devuelve -1, 0 o 1, lo que hace que usort() sea muy limpio de leer.

Combinando funciones: el poder real

La verdadera potencia de estas funciones aparece cuando las combinas. Imagina que tienes una lista de productos y necesitas filtrar los disponibles, calcular el total con IVA y formatear el resultado.

$productos = [
    ['nombre' => 'Mouse', 'precio' => 350, 'stock' => 12],
    ['nombre' => 'Teclado', 'precio' => 750, 'stock' => 0],
    ['nombre' => 'Monitor', 'precio' => 3200, 'stock' => 3],
    ['nombre' => 'Webcam', 'precio' => 1200, 'stock' => 8],
];

$totalConIva = array_reduce(
    array_filter($productos, fn($p) => $p['stock'] > 0),
    fn($total, $p) => $total + ($p['precio'] * 1.16),
    0
);

echo number_format($totalConIva, 2);
// 5559.00

Otro patrón común: obtener una lista limpia de valores únicos a partir de datos crudos.

$registros = [
    ['ciudad' => 'CDMX', 'venta' => 100],
    ['ciudad' => 'Guadalajara', 'venta' => 200],
    ['ciudad' => 'CDMX', 'venta' => 150],
];

$ciudades = array_values(array_unique(array_map(
    fn($r) => $r['ciudad'],
    $registros
)));

print_r($ciudades);
// ["CDMX", "Guadalajara"]

Funciones adicionales útiles

Estas no las cubrimos en detalle pero vale la pena conocerlas:

  • array_column() - Extrae una sola columna de un array multidimensional.
  • array_search() - Busca un valor y devuelve su clave.
  • in_array() - Verifica si un valor existe en un array.
  • array_key_exists() - Verifica si una clave existe.
  • array_slice() - Extrae una porción de un array.
  • array_splice() - Elimina o reemplaza una porción de un array.
  • array_chunk() - Divide un array en fragmentos más pequeños.
$usuarios = [
    ['id' => 1, 'nombre' => 'Ana'],
    ['id' => 2, 'nombre' => 'Luis'],
];

$nombres = array_column($usuarios, 'nombre');
// ["Ana", "Luis"]

$ids = array_column($usuarios, 'id', 'nombre');
// ["Ana" => 1, "Luis" => 2]

Conclusión

Dominar estas funciones te permite escribir código PHP más limpio, declarativo y fácil de mantener. En lugar de llenar tu código con bucles foreach anidados, puedes expresar la intención de tu lógica de forma clara con map, filter y reduce.

Mi recomendación: identifica en tu proyecto actual dónde estás transformando, filtrando o reduciendo listas y reemplaza esos bloques con las funciones adecuadas. Con la práctica, empezarás a ver patrones de procesamiento de datos de forma natural.

¡Espero que estos ejemplos te sean útiles para tu próximo proyecto PHP!