Ordenar un array de objetos en PHP: de principiante a experto
\n\nImagina que estás desarrollando una tienda online en PHP. Tienes un array de productos, cada producto es un objeto con campos como price, name, rating. El usuario hace clic en «Ordenar por precio» y necesitas reordenar ese array al instante. ¿Cómo hacerlo de forma correcta y elegante? De eso trata este artículo.
El tema de ordenar un array de objetos por una propiedad en PHP es una de las consultas más populares en Stack Overflow (¡millones de visitas!). Y no es de extrañar: trabajar con objetos es la base del PHP moderno, y saber ordenar datos de manera flexible es una habilidad imprescindible. Vamos a verlo todo, de lo simple a lo complejo, con ejemplos prácticos y explicaciones claras.
\n\n¿Por qué no podemos usar simplemente sort()?
\n\nLos principiantes suelen intentar usar sort() o rsort() con un array de objetos. Y obtienen un error o un resultado sin sentido. ¿Por qué? Porque estas funciones comparan elementos como valores simples (números o cadenas), pero un objeto es una estructura compleja. PHP no sabe por qué campo quieres ordenar: si por nombre, precio o fecha. Necesitas indicar explícitamente la regla de comparación.
Para eso existen las funciones usort(), uasort() y uksort(). La letra «u» en el nombre significa «user-defined» (definida por el usuario). Tú mismo escribes cómo comparar dos objetos.
Ejemplo básico: ordenar usuarios por edad
\n\nSupongamos que tenemos una clase User y un array de usuarios:
class User {\n public $name;\n public $age;\n \n public function __construct($name, $age) {\n $this->name = $name;\n $this->age = $age;\n }\n}\n\n$users = [\n new User('Ana', 25),\n new User('Juan', 30),\n new User('Olga', 22),\n new User('Pedro', 28)\n];\n\nNecesitamos ordenarlos por edad de forma ascendente. Usamos usort:
\n\nusort($users, function($a, $b) {\n return $a->age <=> $b->age;\n});\n\n// Resultado:\n// Olga (22), Ana (25), Pedro (28), Juan (30)\n\nFíjate en el operador nave espacial ( <=> ) — apareció en PHP 7.0 y hace el código increíblemente conciso. Devuelve -1, 0 o 1, perfecto para funciones de comparación.
Entendiendo el mecanismo de usort
\n\nLa función usort() recibe dos argumentos:
- \n
- El array (se pasa por referencia — el array original se modifica) \n
- Una función callback que compara dos elementos \n
El callback debe devolver:
\n- \n
- Un número negativo (generalmente -1) — si el primer elemento es menor que el segundo \n
- 0 — si los elementos son iguales \n
- Un número positivo (generalmente 1) — si el primer elemento es mayor que el segundo \n
El operador nave espacial hace esto automáticamente. Así se vería la misma ordenación sin él:
\n\nusort($users, function($a, $b) {\n if ($a->age == $b->age) return 0;\n return ($a->age < $b->age) ? -1 : 1;\n});\n\nLa diferencia es evidente: el operador <=> reduce 4 líneas a una. Úsalo siempre que tengas PHP 7+.
Ordenar por cadenas: mayúsculas, minúsculas y locale
\n\nCon números es fácil, pero las cadenas requieren atención. Ordenemos a los mismos usuarios por nombre:
\n\nusort($users, function($a, $b) {\n return strcmp($a->name, $b->name);\n});\n\n// O con el operador nave espacial:\nusort($users, function($a, $b) {\n return $a->name <=> $b->name;\n});\n\nPero hay un detalle: el operador nave espacial distingue mayúsculas. La cadena «apple» será menor que «Banana», porque el código del carácter 'a' (97) es menor que 'B' (66). Para una ordenación sin distinción de mayúsculas, usa strcasecmp():
usort($users, function($a, $b) {\n return strcasecmp($a->name, $b->name);\n});\n\nSi trabajas con caracteres acentuados (como «ñ», «é», «ü»), considera usar setlocale() y strcoll() para una ordenación correcta según el idioma.