Lección 18 de 75 14 min de lectura

Ordenar Arrays

PHP ofrece múltiples funciones para ordenar arrays. Desde ordenación simple hasta ordenación personalizada con callbacks. Todas modifican el array original (excepto cuando se indica lo contrario).

Ordenación básica: sort y rsort

PHP
<?php

// sort() - Ordenar ascendente (reindexa las claves)
$numeros = [3, 1, 4, 1, 5, 9, 2, 6];
sort($numeros);
print_r($numeros); // [1, 1, 2, 3, 4, 5, 6, 9]

// rsort() - Ordenar descendente
$numeros = [3, 1, 4, 1, 5, 9, 2, 6];
rsort($numeros);
print_r($numeros); // [9, 6, 5, 4, 3, 2, 1, 1]

// Con strings
$frutas = ['naranja', 'manzana', 'plátano', 'uva'];
sort($frutas);
print_r($frutas); // ['manzana', 'naranja', 'plátano', 'uva']

// Flags de ordenación
$mixto = ['10', '1', '2', 'a', 'A'];

// SORT_REGULAR (por defecto): compara sin cambiar tipos
sort($mixto, SORT_REGULAR);
print_r($mixto); // Orden puede variar

// SORT_NUMERIC: trata como números
$nums = ['10', '1', '2'];
sort($nums, SORT_NUMERIC);
print_r($nums); // ['1', '2', '10']

// SORT_STRING: compara como strings
sort($nums, SORT_STRING);
print_r($nums); // ['1', '10', '2']

// SORT_NATURAL: ordenación natural (como humanos)
$archivos = ['img1.png', 'img10.png', 'img2.png'];
sort($archivos, SORT_NATURAL);
print_r($archivos); // ['img1.png', 'img2.png', 'img10.png']
sort() reindexa las claves

sort() y rsort() descartan las claves originales y asignan nuevos índices numéricos (0, 1, 2...). Si necesitas mantener las claves, usa asort() o arsort().

Mantener claves: asort y arsort

PHP
<?php

$edades = [
    'ana' => 25,
    'luis' => 30,
    'maría' => 22,
    'pedro' => 28
];

// asort() - Ordena por valor, mantiene claves
asort($edades);
print_r($edades);
/*
Array
(
    [maría] => 22
    [ana] => 25
    [pedro] => 28
    [luis] => 30
)
*/

// arsort() - Ordena por valor descendente, mantiene claves
arsort($edades);
print_r($edades);
/*
Array
(
    [luis] => 30
    [pedro] => 28
    [ana] => 25
    [maría] => 22
)
*/

Ordenar por claves: ksort y krsort

PHP
<?php

$config = [
    'zebra' => 1,
    'alfa' => 2,
    'beta' => 3,
    'gamma' => 4
];

// ksort() - Ordena por clave ascendente
ksort($config);
print_r($config);
/*
Array
(
    [alfa] => 2
    [beta] => 3
    [gamma] => 4
    [zebra] => 1
)
*/

// krsort() - Ordena por clave descendente
krsort($config);
print_r($config);
/*
Array
(
    [zebra] => 1
    [gamma] => 4
    [beta] => 3
    [alfa] => 2
)
*/

// Ordenar claves numéricas
$items = [10 => 'diez', 2 => 'dos', 1 => 'uno'];
ksort($items);
print_r($items); // [1 => 'uno', 2 => 'dos', 10 => 'diez']

Resumen de funciones de ordenación

Función Ordena por Orden Mantiene claves
sort() Valor Ascendente No
rsort() Valor Descendente No
asort() Valor Ascendente
arsort() Valor Descendente
ksort() Clave Ascendente
krsort() Clave Descendente

Ordenación personalizada: usort

usort() permite ordenar con una función de comparación personalizada. Ideal para ordenar objetos o arrays complejos.

PHP
<?php

// La función de comparación debe devolver:
// - Negativo si $a debe ir antes que $b
// - Positivo si $a debe ir después de $b
// - Cero si son iguales

$numeros = [3, 1, 4, 1, 5, 9];

// Ordenar ascendente (equivalente a sort)
usort($numeros, fn($a, $b) => $a - $b);
print_r($numeros); // [1, 1, 3, 4, 5, 9]

// Ordenar descendente
usort($numeros, fn($a, $b) => $b - $a);
print_r($numeros); // [9, 5, 4, 3, 1, 1]

// Spaceship operator (PHP 7+) - más elegante
usort($numeros, fn($a, $b) => $a <=> $b); // Ascendente
usort($numeros, fn($a, $b) => $b <=> $a); // Descendente

// Ordenar strings ignorando mayúsculas
$nombres = ['Ana', 'luis', 'María', 'pedro'];
usort($nombres, fn($a, $b) => strcasecmp($a, $b));
print_r($nombres); // ['Ana', 'luis', 'María', 'pedro']

Ordenar arrays de objetos/registros

PHP
<?php

$productos = [
    ['nombre' => 'Laptop', 'precio' => 999, 'stock' => 5],
    ['nombre' => 'Mouse', 'precio' => 29, 'stock' => 50],
    ['nombre' => 'Teclado', 'precio' => 79, 'stock' => 25],
    ['nombre' => 'Monitor', 'precio' => 299, 'stock' => 10]
];

// Ordenar por precio ascendente
usort($productos, fn($a, $b) => $a['precio'] <=> $b['precio']);

// Ordenar por precio descendente
usort($productos, fn($a, $b) => $b['precio'] <=> $a['precio']);

// Ordenar por nombre
usort($productos, fn($a, $b) => $a['nombre'] <=> $b['nombre']);

// Ordenar por múltiples campos (precio, luego stock)
usort($productos, function($a, $b) {
    $porPrecio = $a['precio'] <=> $b['precio'];
    if ($porPrecio !== 0) {
        return $porPrecio;
    }
    return $a['stock'] <=> $b['stock'];
});

// Versión más compacta con array
usort($productos, fn($a, $b) =>
    [$a['precio'], $a['stock']] <=> [$b['precio'], $b['stock']]
);
Operador spaceship (<=>)

El operador <=> (PHP 7+) devuelve -1, 0 o 1 según si el operando izquierdo es menor, igual o mayor que el derecho. Perfecto para funciones de comparación.

uasort y uksort

PHP
<?php

// uasort() - usort que mantiene claves
$puntuaciones = [
    'ana' => 85,
    'luis' => 92,
    'maría' => 78
];

uasort($puntuaciones, fn($a, $b) => $b <=> $a);
print_r($puntuaciones);
/*
Array
(
    [luis] => 92
    [ana] => 85
    [maría] => 78
)
*/

// uksort() - Ordenar por clave con función personalizada
$datos = [
    'item_10' => 'diez',
    'item_2' => 'dos',
    'item_1' => 'uno'
];

// Ordenar claves numéricamente
uksort($datos, function($a, $b) {
    preg_match('/\d+/', $a, $numA);
    preg_match('/\d+/', $b, $numB);
    return (int)$numA[0] <=> (int)$numB[0];
});

print_r($datos);
// [item_1 => uno, item_2 => dos, item_10 => diez]

array_multisort - Ordenación múltiple

PHP
<?php

// Ordenar múltiples arrays manteniendo correspondencia
$nombres = ['Luis', 'Ana', 'María'];
$edades = [30, 25, 28];

array_multisort($nombres, SORT_ASC, $edades);
print_r($nombres); // ['Ana', 'Luis', 'María']
print_r($edades);  // [25, 30, 28] - Mantiene correspondencia

// Ordenar array de registros por columna
$usuarios = [
    ['nombre' => 'Luis', 'edad' => 30],
    ['nombre' => 'Ana', 'edad' => 25],
    ['nombre' => 'María', 'edad' => 28]
];

// Extraer columna para ordenar
$columnaEdad = array_column($usuarios, 'edad');
array_multisort($columnaEdad, SORT_ASC, $usuarios);

print_r($usuarios);
/*
Array
(
    [0] => Array ( [nombre] => Ana, [edad] => 25 )
    [1] => Array ( [nombre] => María, [edad] => 28 )
    [2] => Array ( [nombre] => Luis, [edad] => 30 )
)
*/

// Ordenar por múltiples columnas
$productos = [
    ['cat' => 'A', 'precio' => 100],
    ['cat' => 'B', 'precio' => 50],
    ['cat' => 'A', 'precio' => 50]
];

$categorias = array_column($productos, 'cat');
$precios = array_column($productos, 'precio');

// Primero por categoría, luego por precio
array_multisort($categorias, SORT_ASC, $precios, SORT_ASC, $productos);

Ordenación natural: natsort

PHP
<?php

$archivos = ['img12.png', 'img1.png', 'img2.png', 'img10.png'];

// sort() ordena como strings
sort($archivos);
print_r($archivos); // ['img1.png', 'img10.png', 'img12.png', 'img2.png']

// natsort() ordena "naturalmente" (como humanos)
$archivos = ['img12.png', 'img1.png', 'img2.png', 'img10.png'];
natsort($archivos);
print_r($archivos); // ['img1.png', 'img2.png', 'img10.png', 'img12.png']

// natcasesort() - igual pero ignora mayúsculas
$items = ['Item12', 'item1', 'Item2', 'item10'];
natcasesort($items);
print_r($items); // ['item1', 'Item2', 'item10', 'Item12']

// Nota: natsort mantiene las claves originales
$archivos = ['a' => 'img2.png', 'b' => 'img1.png'];
natsort($archivos);
print_r($archivos); // ['b' => 'img1.png', 'a' => 'img2.png']

Invertir orden: array_reverse

PHP
<?php

$numeros = [1, 2, 3, 4, 5];

// array_reverse NO modifica el original, devuelve nuevo array
$invertido = array_reverse($numeros);
print_r($invertido); // [5, 4, 3, 2, 1]
print_r($numeros);   // [1, 2, 3, 4, 5] - Sin cambios

// Mantener claves
$datos = ['a' => 1, 'b' => 2, 'c' => 3];
$inv = array_reverse($datos, true);
print_r($inv); // ['c' => 3, 'b' => 2, 'a' => 1]

// Combinar con sort para descendente (alternativa a rsort)
$nums = [3, 1, 4, 1, 5];
sort($nums);
$nums = array_reverse($nums);
print_r($nums); // [5, 4, 3, 1, 1]

Ejercicios

Ejercicio 1: Ordenar numeros

Dado el array $numeros = [42, 8, 15, 3, 99, 27], ordenalo de menor a mayor con sort() e imprime el resultado.

Ver solucion
<?php

declare(strict_types=1);

$numeros = [42, 8, 15, 3, 99, 27];

sort($numeros);

print_r($numeros);
// [3, 8, 15, 27, 42, 99]

Ejercicio 2: Ordenar manteniendo claves

Dado el array $puntuaciones = ['ana' => 85, 'luis' => 92, 'maria' => 78], ordenalo por puntuacion de mayor a menor manteniendo los nombres como claves.

Ver solucion
<?php

declare(strict_types=1);

$puntuaciones = ['ana' => 85, 'luis' => 92, 'maria' => 78];

arsort($puntuaciones);

foreach ($puntuaciones as $nombre => $puntos) {
    echo "$nombre: $puntos\n";
}
// luis: 92
// ana: 85
// maria: 78

Ejercicio 3: Ordenacion personalizada con usort

Dado el array de productos, ordenalos por precio de menor a mayor usando usort() y el operador spaceship.

$productos = [
    ['nombre' => 'Laptop', 'precio' => 999],
    ['nombre' => 'Mouse', 'precio' => 29],
    ['nombre' => 'Monitor', 'precio' => 299]
];
Ver solucion
<?php

declare(strict_types=1);

$productos = [
    ['nombre' => 'Laptop', 'precio' => 999],
    ['nombre' => 'Mouse', 'precio' => 29],
    ['nombre' => 'Monitor', 'precio' => 299]
];

usort($productos, fn($a, $b) => $a['precio'] <=> $b['precio']);

foreach ($productos as $producto) {
    echo "{$producto['nombre']}: {$producto['precio']}€\n";
}
// Mouse: 29€
// Monitor: 299€
// Laptop: 999€

¿Te está gustando el curso?

Tenemos cursos premium con proyectos reales y soporte personalizado.

Descubrir cursos premium