Lección 17 de 75 18 min de lectura

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
<?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
<?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 preserva las claves

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
<?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
<?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
<?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
<?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
<?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
<?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
<?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

¿Te está gustando el curso?

Tenemos cursos premium con proyectos reales y soporte personalizado.

Descubrir cursos premium