Tri d'un tableau d'objets par une propriété en PHP : guide complet

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Tri d'un tableau d'objets en PHP : du débutant au pro

\n\n

Imaginez la situation : vous développez une boutique en ligne en PHP. Vous avez un tableau de produits, chaque produit étant un objet avec des champs price, name, rating. L'utilisateur clique sur « Trier par prix », et vous devez réorganiser ce tableau instantanément. Comment faire cela correctement et élégamment ? C'est exactement l'objet de notre analyse aujourd'hui.

\n\n

Le sujet du tri d'un tableau d'objets par une propriété en PHP est l'une des questions les plus populaires sur Stack Overflow (des millions de vues !). Et ce n'est pas surprenant : travailler avec des objets est la base du PHP moderne, et savoir trier des données de manière flexible est une compétence indispensable. Passons en revue tout cela, du simple au complexe, avec des exemples concrets et des explications.

\n\n

Pourquoi ne peut-on pas simplement utiliser sort() ?

\n\n

Les débutants essaient souvent d'utiliser sort() ou rsort() sur un tableau d'objets. Et ils obtiennent une erreur ou un résultat absurde. Pourquoi ? Parce que ces fonctions comparent les éléments comme des valeurs simples (nombres ou chaînes), alors qu'un objet est une structure complexe. PHP ne sait pas par quel champ vous voulez trier : par nom, prix ou date. Il faut indiquer explicitement la règle de comparaison.

\n\n

C'est exactement à cela que servent les fonctions usort(), uasort() et uksort(). La lettre « u » dans le nom signifie « user-defined » — fonction de comparaison définie par l'utilisateur. Nous écrivons nous-mêmes comment comparer deux objets.

\n\n

Exemple de base : trier des utilisateurs par âge

\n\n

Supposons que nous ayons une classe User et un tableau d'utilisateurs :

\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('Anna', 25),\n    new User('Jean', 30),\n    new User('Olga', 22),\n    new User('Pierre', 28)\n];
\n\n

Nous devons les trier par âge croissant. Utilisons usort :

\n\n
usort($users, function($a, $b) {\n    return $a->age <=> $b->age;\n});\n\n// Résultat :\n// Olga (22), Anna (25), Pierre (28), Jean (30)
\n\n

Remarquez l'opérateur spaceship ( <=> ) — il est apparu en PHP 7.0 et rend le code incroyablement concis. Il retourne -1, 0 ou 1, ce qui est parfait pour les fonctions de comparaison.

\n\n

Comprendre le mécanisme de usort

\n\n

La fonction usort() prend deux arguments :

\n
    \n
  • Le tableau (passé par référence — le tableau d'origine sera modifié)
  • \n
  • Une fonction de rappel (callback) qui compare deux éléments
  • \n
\n\n

Le callback doit retourner :

\n
    \n
  • Un nombre négatif (généralement -1) — si le premier élément est inférieur au second
  • \n
  • 0 — si les éléments sont égaux
  • \n
  • Un nombre positif (généralement 1) — si le premier élément est supérieur au second
  • \n
\n\n

L'opérateur spaceship fait cela automatiquement. Voici à quoi ressemble le même tri sans lui :

\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 différence est évidente : l'opérateur <=> réduit 4 lignes à une seule. Utilisez-le partout où la version PHP 7+ est prise en charge.

\n\n

Tri par chaînes de caractères : tenir compte de la casse et de la locale

\n\n

Avec les nombres, tout est simple, mais les chaînes nécessitent de l'attention. Trions les mêmes utilisateurs par nom :

\n\n
usort($users, function($a, $b) {\n    return strcmp($a->name, $b->name);\n});\n\n// Ou avec spaceship :\nusort($users, function($a, $b) {\n    return $a->name <=> $b->name;\n});
\n\n

Mais il y a un détail : spaceship tient compte de la casse. La chaîne « apple » sera inférieure à « Banane », car le code du caractère 'a' (97) est inférieur à 'B' (66). Pour un tri insensible à la casse, utilisez strcasecmp() :

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

Pour un tri tenant compte de la locale (accents, caractères spéciaux), privilégiez collator ou setlocale() avec strcoll().

Tri décroissant : inverser l'ordre

Pour trier par ordre décroissant, il suffit d'inverser les opérandes dans la fonction de comparaison :

usort($users, function($a, $b) {
    return $b->age <=> $a->age; // Décroissant
});

Ou de multiplier le résultat par -1 :

usort($users, function($a, $b) {
    return -($a->age <=> $b->age); // Décroissant
});

Conserver les clés associatives avec uasort

Si votre tableau a des clés associatives que vous souhaitez préserver, utilisez uasort() au lieu de usort(). La syntaxe est identique :

$products = [
    'prod1' => new Product('Laptop', 1200),
    'prod2' => new Product('Mouse', 25),
    'prod3' => new Product('Keyboard', 80)
];

uasort($products, function($a, $b) {
    return $a->price <=> $b->price;
});

// Les clés 'prod1', 'prod2', 'prod3' sont conservées

Tri multi-critères : par prix, puis par nom

Parfois, vous devez trier par plusieurs propriétés. Par exemple, d'abord par prix croissant, puis par nom alphabétique pour les prix égaux :

usort($products, function($a, $b) {
    // D'abord par prix
    $priceComparison = $a->price <=> $b->price;
    if ($priceComparison !== 0) {
        return $priceComparison;
    }
    // Si les prix sont égaux, trier par nom
    return strcmp($a->name, $b->name);
});

Cette technique est extrêmement puissante et flexible. Vous pouvez ajouter autant de niveaux de tri que nécessaire.

Conclusion et bonnes pratiques

Le tri d'un tableau d'objets en PHP est une opération courante mais qui demande de la précision. Voici les points clés à retenir :

  • Utilisez usort() pour les tableaux indexés, uasort() pour les tableaux associatifs
  • Privilégiez l'opérateur spaceship <=> pour sa simplicité et sa lisibilité
  • Pour les chaînes, faites attention à la casse et à la locale
  • Pour un tri multi-critères, enchaînez les comparaisons
  • Testez toujours votre fonction de tri avec des cas limites (valeurs nulles, types mixtes)

Maîtrisez ces techniques, et vous pourrez manipuler n'importe quel tableau d'objets avec aisance. Bon codage !

Blogs

Book Recommendations