Ordenar array de objetos por una propiedad en PHP: guía completa

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

Ordenar un array de objetos en PHP: de principiante a experto

\n\n

Imagina 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.

\n\n

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\n

Los 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.

\n\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.

\n\n

Ejemplo básico: ordenar usuarios por edad

\n\n

Supongamos que tenemos una clase User y un array de usuarios:

\n\n
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\n

Necesitamos ordenarlos por edad de forma ascendente. Usamos usort:

\n\n
usort($users, function($a, $b) {\n    return $a->age <=> $b->age;\n});\n\n// Resultado:\n// Olga (22), Ana (25), Pedro (28), Juan (30)
\n\n

Fí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.

\n\n

Entendiendo el mecanismo de usort

\n\n

La función usort() recibe dos argumentos:

\n
    \n
  • El array (se pasa por referencia — el array original se modifica)
  • \n
  • Una función callback que compara dos elementos
  • \n
\n\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
\n\n

El operador nave espacial hace esto automáticamente. Así se vería la misma ordenación sin él:

\n\n
usort($users, function($a, $b) {\n    if ($a->age == $b->age) return 0;\n    return ($a->age < $b->age) ? -1 : 1;\n});
\n\n

La diferencia es evidente: el operador <=> reduce 4 líneas a una. Úsalo siempre que tengas PHP 7+.

\n\n

Ordenar por cadenas: mayúsculas, minúsculas y locale

\n\n

Con números es fácil, pero las cadenas requieren atención. Ordenemos a los mismos usuarios por nombre:

\n\n
usort($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\n

Pero 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():

\n\n
usort($users, function($a, $b) {\n    return strcasecmp($a->name, $b->name);\n});
\n\n

Si trabajas con caracteres acentuados (como «ñ», «é», «ü»), considera usar setlocale() y strcoll() para una ordenación correcta según el idioma.

Blogs

Book Recommendations