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
// 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() 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
$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
$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 | Sí |
arsort() |
Valor | Descendente | Sí |
ksort() |
Clave | Ascendente | Sí |
krsort() |
Clave | Descendente | Sí |
Ordenación personalizada: usort
usort() permite ordenar con una
función de comparación personalizada. Ideal para
ordenar objetos o arrays complejos.
<?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
$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']]
);
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
// 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
// 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
$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
$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€
¿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