Funciones de Arrays
PHP tiene más de 80 funciones para trabajar con arrays. En esta lección aprenderás las más importantes: transformar con map, filtrar con filter, reducir con reduce, y muchas más funciones esenciales.
array_map - Transformar elementos
array_map() aplica una función a
cada elemento del array y devuelve un nuevo
array con los resultados.
<?php
$numeros = [1, 2, 3, 4, 5];
// Duplicar cada número
$duplicados = array_map(fn($n) => $n * 2, $numeros);
print_r($duplicados); // [2, 4, 6, 8, 10]
// Elevar al cuadrado
$cuadrados = array_map(fn($n) => $n ** 2, $numeros);
print_r($cuadrados); // [1, 4, 9, 16, 25]
// Transformar strings
$nombres = ['ana', 'luis', 'maría'];
$mayusculas = array_map('strtoupper', $nombres);
print_r($mayusculas); // ['ANA', 'LUIS', 'MARÍA']
// Con función anónima más compleja
$usuarios = [
['nombre' => 'Ana', 'edad' => 25],
['nombre' => 'Luis', 'edad' => 30]
];
$nombresFormateados = array_map(function($u) {
return "{$u['nombre']} ({$u['edad']} años)";
}, $usuarios);
print_r($nombresFormateados);
// ['Ana (25 años)', 'Luis (30 años)']
array_filter - Filtrar elementos
array_filter() devuelve un nuevo
array con solo los elementos que cumplen una
condición.
<?php
$numeros = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
// Filtrar números pares
$pares = array_filter($numeros, fn($n) => $n % 2 === 0);
print_r($pares); // [2, 4, 6, 8, 10]
// Filtrar mayores que 5
$mayores = array_filter($numeros, fn($n) => $n > 5);
print_r($mayores); // [6, 7, 8, 9, 10]
// Sin callback: elimina valores "falsy" (0, '', null, false)
$datos = [0, 1, '', 'hola', null, true, false];
$filtrado = array_filter($datos);
print_r($filtrado); // [1, 'hola', true]
// Filtrar productos con stock
$productos = [
['nombre' => 'Laptop', 'stock' => 5],
['nombre' => 'Mouse', 'stock' => 0],
['nombre' => 'Teclado', 'stock' => 12]
];
$conStock = array_filter($productos, fn($p) => $p['stock'] > 0);
print_r($conStock);
// Usar las claves en el filtro
$edades = ['ana' => 25, 'luis' => 17, 'maría' => 30];
$mayoresDeEdad = array_filter(
$edades,
fn($edad, $nombre) => $edad >= 18,
ARRAY_FILTER_USE_BOTH
);
print_r($mayoresDeEdad); // ['ana' => 25, 'maría' => 30]
array_filter() mantiene las
claves originales. Si necesitas
reindexar, usa
array_values(array_filter(...)).
array_reduce - Reducir a un valor
array_reduce() procesa todos los
elementos y los reduce a un único valor (suma,
concatenación, objeto, etc.).
<?php
$numeros = [1, 2, 3, 4, 5];
// Sumar todos los elementos
$suma = array_reduce($numeros, fn($total, $n) => $total + $n, 0);
echo $suma; // 15
// También puedes usar array_sum()
$suma = array_sum($numeros); // 15
// Multiplicar todos
$producto = array_reduce($numeros, fn($total, $n) => $total * $n, 1);
echo $producto; // 120
// Concatenar strings
$palabras = ['Hola', 'mundo', 'PHP'];
$frase = array_reduce($palabras, fn($acc, $p) => $acc . ' ' . $p, '');
echo trim($frase); // Hola mundo PHP
// Encontrar el máximo (aunque existe max())
$maximo = array_reduce($numeros, fn($max, $n) => $n > $max ? $n : $max, PHP_INT_MIN);
echo $maximo; // 5
// Agrupar por categoría
$productos = [
['nombre' => 'Manzana', 'categoria' => 'fruta'],
['nombre' => 'Laptop', 'categoria' => 'tech'],
['nombre' => 'Pera', 'categoria' => 'fruta'],
['nombre' => 'Mouse', 'categoria' => 'tech']
];
$porCategoria = array_reduce($productos, function($acc, $producto) {
$cat = $producto['categoria'];
$acc[$cat][] = $producto['nombre'];
return $acc;
}, []);
print_r($porCategoria);
/*
Array
(
[fruta] => Array ( [0] => Manzana, [1] => Pera )
[tech] => Array ( [0] => Laptop, [1] => Mouse )
)
*/
array_merge y spread operator
<?php
$a = [1, 2, 3];
$b = [4, 5, 6];
// Unir arrays
$unidos = array_merge($a, $b);
print_r($unidos); // [1, 2, 3, 4, 5, 6]
// Spread operator (PHP 7.4+)
$unidos = [...$a, ...$b];
print_r($unidos); // [1, 2, 3, 4, 5, 6]
// Añadir elementos
$nuevo = [...$a, 10, 20];
print_r($nuevo); // [1, 2, 3, 10, 20]
// Con arrays asociativos (el segundo sobrescribe)
$defaults = ['color' => 'rojo', 'tamaño' => 'M'];
$opciones = ['color' => 'azul', 'stock' => 10];
$config = array_merge($defaults, $opciones);
print_r($config);
// ['color' => 'azul', 'tamaño' => 'M', 'stock' => 10]
// Spread con asociativos (PHP 8.1+)
$config = [...$defaults, ...$opciones];
// array_merge_recursive para fusión profunda
$a = ['colores' => ['rojo', 'verde']];
$b = ['colores' => ['azul']];
$merged = array_merge_recursive($a, $b);
print_r($merged);
// ['colores' => ['rojo', 'verde', 'azul']]
array_slice y array_splice
<?php
$frutas = ['manzana', 'pera', 'naranja', 'plátano', 'uva'];
// array_slice: extraer porción (no modifica el original)
$porcion = array_slice($frutas, 1, 3);
print_r($porcion); // ['pera', 'naranja', 'plátano']
// Desde el final
$ultimos = array_slice($frutas, -2);
print_r($ultimos); // ['plátano', 'uva']
// Primeros N elementos
$primeros = array_slice($frutas, 0, 2);
print_r($primeros); // ['manzana', 'pera']
// array_splice: extraer Y modificar el original
$frutas = ['manzana', 'pera', 'naranja', 'plátano', 'uva'];
$eliminados = array_splice($frutas, 2, 2);
print_r($eliminados); // ['naranja', 'plátano']
print_r($frutas); // ['manzana', 'pera', 'uva']
// Insertar elementos
$frutas = ['manzana', 'pera', 'uva'];
array_splice($frutas, 1, 0, ['kiwi', 'fresa']);
print_r($frutas); // ['manzana', 'kiwi', 'fresa', 'pera', 'uva']
// Reemplazar elementos
$frutas = ['manzana', 'pera', 'naranja'];
array_splice($frutas, 1, 1, ['kiwi']);
print_r($frutas); // ['manzana', 'kiwi', 'naranja']
array_unique y array_flip
<?php
// Eliminar duplicados
$numeros = [1, 2, 2, 3, 3, 3, 4];
$unicos = array_unique($numeros);
print_r($unicos); // [1, 2, 3, 4]
// Con strings
$tags = ['php', 'javascript', 'php', 'css', 'javascript'];
$tagsUnicos = array_unique($tags);
print_r($tagsUnicos); // ['php', 'javascript', 'css']
// Reindexar después de unique
$tagsUnicos = array_values(array_unique($tags));
// array_flip: intercambia claves y valores
$meses = ['enero' => 1, 'febrero' => 2, 'marzo' => 3];
$numerosMeses = array_flip($meses);
print_r($numerosMeses); // [1 => 'enero', 2 => 'febrero', 3 => 'marzo']
// Uso práctico: verificar si existe en lista
$permitidos = ['admin', 'editor', 'moderador'];
$lookup = array_flip($permitidos);
$rol = 'editor';
if (isset($lookup[$rol])) {
echo 'Rol permitido';
}
// Más rápido que in_array() para arrays grandes
array_diff y array_intersect
<?php
$a = [1, 2, 3, 4, 5];
$b = [3, 4, 5, 6, 7];
// Elementos en $a que NO están en $b
$diferencia = array_diff($a, $b);
print_r($diferencia); // [1, 2]
// Elementos en ambos arrays
$comunes = array_intersect($a, $b);
print_r($comunes); // [3, 4, 5]
// Con arrays asociativos (compara valores)
$user1 = ['nombre' => 'Ana', 'edad' => 25, 'ciudad' => 'Madrid'];
$user2 = ['nombre' => 'Ana', 'edad' => 30, 'pais' => 'España'];
$diff = array_diff($user1, $user2);
print_r($diff); // ['edad' => 25, 'ciudad' => 'Madrid']
// Comparar claves
$diffKeys = array_diff_key($user1, $user2);
print_r($diffKeys); // ['ciudad' => 'Madrid']
// Comparar clave Y valor
$diffAssoc = array_diff_assoc($user1, $user2);
print_r($diffAssoc); // ['edad' => 25, 'ciudad' => 'Madrid']
// Ejemplo práctico: permisos
$permisosRequeridos = ['leer', 'escribir', 'eliminar'];
$permisosUsuario = ['leer', 'escribir'];
$faltan = array_diff($permisosRequeridos, $permisosUsuario);
if (!empty($faltan)) {
echo 'Faltan permisos: ' . implode(', ', $faltan);
}
// Faltan permisos: eliminar
array_walk - Modificar en su lugar
<?php
$precios = [100, 200, 300];
// array_walk modifica el array original
array_walk($precios, function(&$precio) {
$precio *= 1.21; // Añadir IVA
});
print_r($precios); // [121, 242, 363]
// Con clave disponible
$usuarios = ['ana' => 25, 'luis' => 30];
array_walk($usuarios, function(&$edad, $nombre) {
$edad = "$nombre tiene $edad años";
});
print_r($usuarios);
// ['ana' => 'ana tiene 25 años', 'luis' => 'luis tiene 30 años']
// Pasar datos extra
$descuento = 0.1;
array_walk($precios, function(&$precio) use ($descuento) {
$precio *= (1 - $descuento);
});
// Diferencia con array_map:
// - array_walk modifica el original, array_map devuelve nuevo array
// - array_walk siempre devuelve true/false
// - array_walk puede acceder a las claves fácilmente
Funciones útiles adicionales
<?php
$numeros = [3, 1, 4, 1, 5, 9, 2, 6];
// Estadísticas
echo array_sum($numeros); // 31
echo count($numeros); // 8
echo max($numeros); // 9
echo min($numeros); // 1
// Producto de todos los elementos
echo array_product([2, 3, 4]); // 24
// Invertir orden
$invertido = array_reverse($numeros);
print_r($invertido); // [6, 2, 9, 5, 1, 4, 1, 3]
// Barajar aleatoriamente
shuffle($numeros);
print_r($numeros); // Orden aleatorio
// Obtener N elementos aleatorios
$claves = array_rand($numeros, 3);
print_r($claves); // 3 índices aleatorios
// Rellenar array
$relleno = array_fill(0, 5, 'x');
print_r($relleno); // ['x', 'x', 'x', 'x', 'x']
// Crear rango
$rango = range(1, 5);
print_r($rango); // [1, 2, 3, 4, 5]
$letras = range('a', 'e');
print_r($letras); // ['a', 'b', 'c', 'd', 'e']
// Dividir en chunks
$lista = [1, 2, 3, 4, 5, 6, 7];
$grupos = array_chunk($lista, 3);
print_r($grupos);
// [[1, 2, 3], [4, 5, 6], [7]]
Ejercicios
Ejercicio 1: Transformar con array_map
Dado el array
$precios = [100, 200, 50, 75], usa
array_map para crear un nuevo array donde cada
precio tenga un 21% de IVA anadido.
Ver solucion
<?php
declare(strict_types=1);
$precios = [100, 200, 50, 75];
$preciosConIva = array_map(fn($precio) => $precio * 1.21, $precios);
print_r($preciosConIva);
// [121, 242, 60.5, 90.75]
Ejercicio 2: Filtrar con array_filter
Dado el array
$edades = [15, 22, 17, 30, 12, 45],
usa array_filter para obtener solo las edades de
mayores de edad (18 o mas).
Ver solucion
<?php
declare(strict_types=1);
$edades = [15, 22, 17, 30, 12, 45];
$mayores = array_filter($edades, fn($edad) => $edad >= 18);
print_r(array_values($mayores));
// [22, 30, 45]
Ejercicio 3: Reducir con array_reduce
Dado el array
$cantidades = [5, 3, 8, 2, 10], usa
array_reduce para calcular el producto de todos
los numeros.
Ver solucion
<?php
declare(strict_types=1);
$cantidades = [5, 3, 8, 2, 10];
$producto = array_reduce(
$cantidades,
fn($total, $num) => $total * $num,
1
);
echo "El producto es: $producto\n";
// El producto es: 2400
¿Has encontrado un error o tienes una sugerencia para mejorar esta lección?
Escríbenos¿Te está gustando el curso?
Tenemos cursos premium con proyectos reales y soporte personalizado.
Descubrir cursos premium