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\nEn 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.
¡Allá vamos!
\n\n¿Qué es un array de arrays asociativos y por qué ordenarlo?
\n\nImagina 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\nEste 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\nLas funciones estándar de PHP como sort() o asort() no ayudan aquí: funcionan con valores simples, no con estructuras anidadas. Se necesitan herramientas especiales.
La forma más popular: usort con función anónima
\n\nSi 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.
Cómo ordenar un array por un solo campo (edad)
\n\nSupongamos 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\nResultado:
\nArray\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\nObserva 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:
usort($users, function($a, $b) {\n return $b['age'] <=> $a['age'];\n});\n\nOrdenamiento por un campo de texto (nombre)
\n\nPara cadenas de texto es igual de sencillo. ¿Quieres ordenar a los usuarios por nombre en orden alfabético? Por supuesto:
\n\nusort($users, function($a, $b) {\n return strcmp($a['name'], $b['name']);\n});\n\nO usa nuevamente <=> — también funciona con cadenas:
usort($users, function($a, $b) {\n return $a['name'] <=> $b['name'];\n});\n\nPreguntas frecuentes y dificultades comunes
\n\n1. ¿Cómo ordenar por una clave anidada?
\n\nA veces los datos tienen una estructura más profunda. Por ejemplo, cada usuario tiene un array profile