Ordenamiento de un array por valor de columna en PHP: todo lo que necesitas saber

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Ordenamiento de un array por valor de columna en PHP: guía para quienes están cansados de buscar en Google

\n\n

¿Alguna vez te has encontrado con una situación en la que tienes una lista de usuarios, productos o pedidos en forma de un array de arrays asociativos y necesitas ordenarlos por algún campo? Por ejemplo, por edad, precio o fecha de registro. Si es así, no estás solo. Esta pregunta en Stack Overflow ha acumulado miles de visitas y decenas de votos. Y hoy la resolveremos de una vez por todas.

\n\n

En este artículo no solo mostraremos cómo funcionan usort y array_multisort. Responderemos a las preguntas más frecuentes que surgen entre los desarrolladores: cómo ordenar por una clave anidada, cómo conservar las claves, cómo ordenar por varios campos y qué hacer si los datos provienen de una base de datos.

\n\n

¡Allá vamos!

\n\n

¿Qué es un array de arrays asociativos y por qué ordenarlo?

\n\n

Imagina que tienes una lista de usuarios:

\n\n
$users = [\n    ['name' => 'Ana', 'age' => 25, 'city' => 'Madrid'],\n    ['name' => 'Borja', 'age' => 30, 'city' => 'Barcelona'],\n    ['name' => 'Víctor', 'age' => 22, 'city' => 'Valencia'],\n];
\n\n

Este es un típico array multidimensional en PHP, donde cada elemento es un array asociativo con las mismas claves. A menudo es necesario mostrar esta lista ordenada por algún campo: por edad (de menor a mayor), por nombre (en orden alfabético) o por ciudad.

\n\n

Las funciones estándar de PHP como sort() o asort() no ayudan aquí: funcionan con valores simples, no con estructuras anidadas. Se necesitan herramientas especiales.

\n\n

La forma más popular: usort con función anónima

\n\n

Si entras en Stack Overflow y abres el debate "Sort an array of associative arrays by column value", en el 90% de los casos te recomendarán usort. Es lógico: la función usort permite definir tu propia lógica de comparación entre dos elementos del array.

\n\n

Cómo ordenar un array por un solo campo (edad)

\n\n

Supongamos que queremos ordenar nuestros usuarios por edad de forma ascendente:

\n\n
<?php\n$users = [\n    ['name' => 'Ana', 'age' => 25, 'city' => 'Madrid'],\n    ['name' => 'Borja', 'age' => 30, 'city' => 'Barcelona'],\n    ['name' => 'Víctor', 'age' => 22, 'city' => 'Valencia'],\n];\n\nusort($users, function($a, $b) {\n    return $a['age'] <=> $b['age'];\n});\n\nprint_r($users);\n?>
\n\n

Resultado:

\n
Array\n(\n    [0] => Array ( [name] => Víctor [age] => 22 [city] => Valencia )\n    [1] => Array ( [name] => Ana [age] => 25 [city] => Madrid )\n    [2] => Array ( [name] => Borja [age] => 30 [city] => Barcelona )\n)
\n\n

Observa que usamos el operador nave espacial <=> (spaceship), que apareció en PHP 7. Devuelve -1, 0 o 1, lo que es ideal para funciones de ordenamiento. Si necesitas ordenar de forma descendente, simplemente intercambia $a y $b:

\n\n
usort($users, function($a, $b) {\n    return $b['age'] <=> $a['age'];\n});
\n\n

Ordenamiento por un campo de texto (nombre)

\n\n

Para cadenas de texto es igual de sencillo. ¿Quieres ordenar a los usuarios por nombre en orden alfabético? Por supuesto:

\n\n
usort($users, function($a, $b) {\n    return strcmp($a['name'], $b['name']);\n});
\n\n

O usa nuevamente <=> — también funciona con cadenas:

\n\n
usort($users, function($a, $b) {\n    return $a['name'] <=> $b['name'];\n});
\n\n

Preguntas frecuentes y dificultades comunes

\n\n

1. ¿Cómo ordenar por una clave anidada?

\n\n

A veces los datos tienen una estructura más profunda. Por ejemplo, cada usuario tiene un array profile

Blogs

Book Recommendations