usort()
Apprenez à utiliser usort() en PHP pour trier un tableau avec un callback de comparaison personnalisé, avec des exemples sur les chaînes, nombres et objets.
La fonction usort() de PHP trie un tableau à l'aide d'une fonction de comparaison que vous écrivez. Là où des fonctions intégrées comme sort() ne savent ordonner les valeurs que d'une seule façon (croissant, par valeur), usort() vous permet d'exprimer n'importe quelle règle — trier des objets par propriété, des nombres dans un ordre personnalisé, ou des chaînes selon une règle de départage. Cette page explique le fonctionnement du callback de comparaison, illustre des exemples avec des chaînes, des nombres et des objets, et aborde les pièges courants.
Qu'est-ce que la fonction usort() ?
La fonction usort() est une fonction PHP intégrée qui trie un tableau selon votre propre règle de comparaison. Contrairement aux fonctions de tri standard qui trient par valeur ou par clé en ordre croissant/décroissant, usort() nécessite un callback pour définir la logique de comparaison. Elle modifie le tableau original en place et retourne true en cas de succès ou false en cas d'échec (vous triez donc le tableau sans capturer la valeur de retour comme résultat trié).
Fonctionnement du callback de comparaison
Le callback reçoit deux éléments, $a et $b, et doit retourner un entier indiquant à usort() leur ordre relatif :
- un nombre négatif si
$adoit venir avant$b, - un nombre positif si
$adoit venir après$b, 0s'ils sont considérés comme égaux.
Depuis PHP 7, l'opérateur vaisseau spatial <=> fait exactement cela en une seule étape : $a <=> $b retourne -1, 0 ou 1. La plupart des callbacks de comparaison se réduisent à un seul return qui l'utilise.
Remarque : usort() n'est pas un tri stable. Si deux éléments sont considérés comme égaux, leur ordre relatif d'origine n'est pas garanti. À partir de PHP 8.0, le tri est stable, mais les versions antérieures ne le sont pas. De plus, usort() réindexe le tableau séquentiellement à partir de 0, les clés d'origine sont donc perdues — utilisez uasort() si vous devez conserver les associations de clés.
Syntaxe
La syntaxe de la fonction usort() est la suivante :
Syntaxe de la fonction usort() en PHP
usort($array, $callback);Ici, $array est le tableau à trier, et $callback est la fonction de rappel qui définit les règles de tri personnalisées.
Paramètres et valeur de retour
| Paramètre | Type | Description |
|---|---|---|
$array | array | Le tableau à trier. |
$callback | callable | Une fonction de comparaison définie par l'utilisateur. |
Valeur de retour : Retourne true en cas de succès ou false en cas d'échec.
Exemple d'utilisation
Voyons un exemple pour comprendre le fonctionnement de la fonction usort(). Supposons que nous avons un tableau de noms que nous voulons trier par ordre alphabétique, mais avec une règle personnalisée stipulant que tous les noms commençant par « J » doivent apparaître en premier.
Comment utiliser la fonction usort() en PHP ?
Dans cet exemple, nous définissons une fonction de callback qui compare deux noms et retourne -1, 0 ou 1 selon les règles de tri personnalisées. Si la première lettre de $a est « J » et que la première lettre de $b n'est pas « J », alors $a vient avant $b. Si la première lettre de $a n'est pas « J » et que la première lettre de $b est « J », alors $b vient avant $a. Si les deux noms commencent par « J » ou si aucun ne commence par « J », nous utilisons l'opérateur vaisseau spatial (<=>) de PHP pour les comparer alphabétiquement.
Après exécution de ce code, le tableau $names sera trié comme suit :
Array
(
[0] => Jack
[1] => Jenny
[2] => John
[3] => Adam
[4] => Bob
)Trier des objets ou des tableaux par un champ
L'utilisation la plus courante de usort() dans le monde réel consiste à ordonner une liste d'enregistrements (tableaux associatifs ou objets) selon l'un de leurs champs — ce que sort() ne peut pas faire. Ici, nous trions une liste de produits par prix, en ordre croissant :
<?php
$products = [
["name" => "Book", "price" => 15],
["name" => "Pen", "price" => 2],
["name" => "Laptop", "price" => 900],
];
usort($products, fn ($a, $b) => $a["price"] <=> $b["price"]);
print_r(array_column($products, "name"));Toute la comparaison tient en une seule expression vaisseau spatial. Le résultat, du moins cher au plus cher :
Array
(
[0] => Pen
[1] => Book
[2] => Laptop
)Pour trier en ordre décroissant, il suffit d'inverser les opérandes : $b["price"] <=> $a["price"].
Pièges courants
- Mauvaise utilisation de la valeur de retour.
usort()retournetrue/false, pas le tableau trié. Écrire$sorted = usort($arr, ...)vous donnetrue, pas vos données. Le tableau est trié en place. - Les clés sont réinitialisées. Les clés d'origine sont supprimées et remplacées par
0, 1, 2, …. Utilisezuasort()pour conserver les clés, ouuksort()pour trier par clés. - Retourner un booléen depuis le callback. Retourner
$a > $b(un booléen) fonctionne par hasard pour l'ordre croissant mais échoue pour l'ordre décroissant et les cas d'égalité. Retournez toujours un entier — préférez<=>.
Fonctions associées
sort()— trie un tableau par valeur, en ordre croissant, sans callback.asort()— trie par valeur tout en préservant les clés.ksort()— trie par clé.uasort()— commeusort()mais préserve les associations de clés.uksort()— trie par clés à l'aide d'un callback personnalisé.
Conclusion
Dans cet article, nous avons présenté la fonction usort() en PHP et montré comment elle peut être utilisée pour trier des tableaux avec des règles de tri personnalisées. En définissant une fonction de callback, vous pouvez trier des tableaux dans n'importe quel ordre selon vos propres règles. Cette fonction s'avère particulièrement utile lorsque les fonctions de tri intégrées à PHP ne suffisent pas à répondre à vos besoins. Avec usort(), vous avez un contrôle total sur la façon dont vos tableaux sont triés.