W3docs

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 ($a et $b) et renvoie un entier :
    • un nombre négatif si $a doit venir avant $b,
    • 0 s'ils sont considérés comme égaux,
    • un nombre positif si $a doit venir après $b.

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() de usort() (qui compare les valeurs) et uasort() (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 donne true. Utilisez $arr ensuite à 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, utilisez shuffle() sur les valeurs ou array_rand() sur les clés.
  • Renvoyez un entier. Renvoyer un bool fonctionne par coercition mais est fragile — false devient 0 (égal), donc return $a < $b; est un bug. Utilisez <=> ou strcmp().

Comparaison de uksort() avec les fonctions associées

FonctionTrie parCallback personnaliséConserve l'association de clés
uksort()clésouioui
ksort()clésnon (ordre naturel)oui
usort()valeursouinon (réindexé)
uasort()valeursouioui
asort()valeursnonoui

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];

Pratique

Pratique
Quel est le rôle de la fonction uksort() en PHP ?
Quel est le rôle de la fonction uksort() en PHP ?
Was this page helpful?