uksort()
Apprenez uksort() en PHP : triez un tableau par ses clés avec une fonction de comparaison personnalisée. Syntaxe, valeur de retour et différences avec ksort() et usort().
Introduction
uksort() trie un tableau par ses clés à l'aide d'une fonction de comparaison que vous écrivez vous-même. Contrairement à ksort(), qui trie uniquement les clés dans leur ordre naturel croissant, uksort() vous laisse décider de l'ordre — alphabétique, inverse, par longueur de chaîne, selon une liste de priorités personnalisée, ou toute règle que vous pouvez exprimer en code. L'association clé-valeur est toujours préservée.
Cette page couvre la syntaxe et la valeur de retour, le fonctionnement du callback de comparaison, plusieurs exemples exécutables (y compris l'opérateur spaceship), les pièges courants, et les différences entre uksort() et les fonctions de tri associées.
Syntaxe
uksort(array &$array, callable $callback): true$array— le tableau à trier. Il est passé par référence et trié en place, de sorte que la variable d'origine est modifiée directement.$callback— une fonction de comparaison qui reçoit deux clés ($aet$b) et renvoie un entier :- un nombre négatif si
$adoit venir avant$b, 0s'ils sont considérés comme égaux,- un nombre positif si
$adoit venir après$b.
- un nombre négatif si
La fonction renvoie true (en PHP 8+ ; elle renvoyait un bool auparavant). Le tri se faisant par référence, vous lisez le résultat depuis la variable du tableau d'origine — et non depuis la valeur de retour.
Le callback compare les clés, pas les valeurs. C'est le seul fait qui distingue
uksort()deusort()(qui compare les valeurs) etuasort()(qui compare les valeurs mais conserve l'association de clés).
Exemple de base : trier les clés alphabétiquement
Supposons que nous ayons un tableau de fruits indexé par nom, et que nous souhaitions les avoir dans l'ordre alphabétique par clé :
<?php
$fruits = [
"orange" => 3,
"apple" => 2,
"banana" => 1,
];
function cmp($a, $b)
{
return strcmp($a, $b);
}
uksort($fruits, "cmp");
print_r($fruits);strcmp() renvoie déjà un entier négatif, nul ou positif, il s'intègre donc directement dans le callback. Le résultat est trié par clé :
Array
(
[apple] => 2
[banana] => 1
[orange] => 3
)Utiliser l'opérateur spaceship
Depuis PHP 7, l'opérateur spaceship <=> renvoie -1, 0 ou 1 pour inférieur à, égal ou supérieur à — exactement la forme attendue par uksort(). Avec une fonction fléchée, le callback tient en une seule ligne :
<?php
$data = ["delta" => 1, "alpha" => 2, "charlie" => 3, "bravo" => 4];
uksort($data, fn($a, $b) => $a <=> $b);
print_r($data);Cela trie les clés par ordre croissant :
Array
(
[alpha] => 2
[bravo] => 4
[charlie] => 3
[delta] => 1
)Pour inverser l'ordre, échangez les opérandes : fn($a, $b) => $b <=> $a.
Un ordre personnalisé
La véritable puissance de uksort() réside dans le tri selon une règle qu'aucune fonction intégrée ne fournit — par exemple, par longueur de clé, puis alphabétiquement pour les égalités :
<?php
$config = [
"id" => 1,
"name" => "Ann",
"is_active" => true,
"x" => 0,
];
uksort($config, function ($a, $b) {
return strlen($a) <=> strlen($b) // shortest keys first
?: strcmp($a, $b); // ties broken alphabetically
});
print_r($config);Le court-circuit ?: renvoie le résultat de la comparaison de longueur sauf s'il vaut 0, auquel cas il bascule sur la comparaison alphabétique :
Array
(
[x] => 0
[id] => 1
[name] => Ann
[is_active] => 1
)Pièges courants
- Elle renvoie
true, pas le tableau trié. Écrire$sorted = uksort($arr, ...)vous donnetrue. Utilisez$arrensuite à la place. - Le tableau d'origine est modifié. Copiez-le d'abord (
$copy = $arr;) si vous devez conserver l'ordre original. - Le callback doit être cohérent. Renvoyer des valeurs aléatoires (p. ex.
rand(-1, 1)) donne des résultats indéfinis. Pour mélanger, utilisezshuffle()sur les valeurs ouarray_rand()sur les clés. - Renvoyez un entier. Renvoyer un
boolfonctionne par coercition mais est fragile —falsedevient0(égal), doncreturn $a < $b;est un bug. Utilisez<=>oustrcmp().
Comparaison de uksort() avec les fonctions associées
| Fonction | Trie par | Callback personnalisé | Conserve l'association de clés |
|---|---|---|---|
uksort() | clés | oui | oui |
ksort() | clés | non (ordre naturel) | oui |
usort() | valeurs | oui | non (réindexé) |
uasort() | valeurs | oui | oui |
asort() | valeurs | non | oui |
En résumé : utilisez uksort() chaque fois que vous devez ordonner un tableau associatif par ses clés selon une règle que ksort() ne peut pas exprimer. Pour en savoir plus sur le sujet, consultez Trier des tableaux en PHP.
Conclusion
uksort() trie un tableau associatif par ses clés à l'aide d'un callback de comparaison que vous contrôlez, modifiant le tableau en place et préservant les liens clé-valeur. Avec l'opérateur spaceship, le callback est concis, et une logique personnalisée vous permet d'implémenter des ordres qu'aucune fonction intégrée ne propose.
Diagramme
graph LR
A[Array] --> B(Function);
B --> C[Comparison result];
C --> D{Is result negative?};
D -->|Yes| E[Swap];
C -->|No| F[Do not swap];
F --> G[Next comparison];
E --> G[Next comparison];