Comment trier des chaînes en ordre naturel en PHP
Découvrez comment utiliser natsort() en PHP pour trier des tableaux en ordre naturel, en traitant les chiffres comme des valeurs numériques.
Lorsque vous triez des chaînes contenant des chiffres en PHP, le tri alphabétique par défaut produit souvent des résultats qui paraissent « incorrects » à un lecteur humain. La fonction natsort() de PHP résout ce problème en triant un tableau à l'aide d'un algorithme d'ordre naturel — de la même façon qu'une personne ordonnerait file1, file2, file10 plutôt que file1, file10, file2.
Cette page explique ce qu'est le tri en ordre naturel, comment fonctionne natsort() (y compris le fait qu'elle préserve les clés), en quoi elle diffère de sort(), comment gérer la casse et les pièges courants.
Qu'est-ce que le tri en ordre naturel ?
Le tri en ordre naturel (également appelé tri alphanumérique) traite les suites de chiffres à l'intérieur d'une chaîne comme un seul nombre plutôt que comme des caractères individuels. Avec un tri alphabétique classique, "100" vient avant "2" car la comparaison s'arrête au premier caractère et '1' est inférieur à '2' dans la table ASCII. Le tri en ordre naturel compare plutôt 100 et 2 comme des nombres, de sorte que 2 vient correctement en premier.
Cela est important chaque fois que vos chaînes mélangent du texte et des chiffres — des noms de fichiers (img10.png), des libellés de version (v2.13), ou des éléments comme "10 apples" et "2 oranges".
Syntaxe
natsort(array &$array): truenatsort() prend le tableau par référence, le trie sur place et (depuis PHP 8.2) retourne toujours true. Dans les versions plus anciennes, le type de retour est bool. Comme le tableau est modifié directement, vous n'assignez pas le résultat — vous lisez la variable d'origine après l'appel.
Comment utiliser la fonction natsort()
Comparez l'ordre naturel avec un tri alphabétique classique via sort() :
$fruits = array("10 apples", "2 oranges", "100 bananas");
natsort($fruits);
print_r($fruits);Résultat :
Array
(
[1] => 2 oranges
[0] => 10 apples
[2] => 100 bananas
)Remarquez que les clés d'origine (1, 0, 2) sont conservées et déplacées avec leurs valeurs — natsort() est un tri qui préserve les clés, tout comme asort(). Si vous utilisez le sort() classique à la place, vous obtiendrez le résultat alphabétique (avec réindexation) :
Array
(
[0] => 10 apples
[1] => 100 bananas
[2] => 2 oranges
)Ici "100 bananas" se retrouve au milieu car sort() compare caractère par caractère.
Trier des noms ressemblant à des fichiers
Le cas d'utilisation classique est l'ordonnancement de noms de fichiers se terminant par des chiffres :
$files = array("file20", "file3", "file1");
natsort($files);
print_r($files);Résultat :
Array
(
[2] => file1
[1] => file3
[0] => file20
)Un tri classique placerait file20 avant file3 — rarement ce que l'on souhaite lors d'un listage de fichiers.
natsort() est sensible à la casse
natsort() compare les lettres majuscules avant les minuscules (les codes ASCII des majuscules sont plus bas). Une entrée à casse mixte regroupe donc les majuscules en premier :
$images = array("img12", "img10", "IMG2", "img1");
natsort($images);
print_r($images);Résultat :
Array
(
[2] => IMG2
[3] => img1
[1] => img10
[0] => img12
)IMG2 est trié avant les noms en minuscules. Lorsque la casse doit être ignorée, utilisez la variante insensible à la casse natcasesort() :
$images = array("img12", "img10", "IMG2", "img1");
natcasesort($images);
print_r($images);Résultat :
Array
(
[3] => img1
[2] => IMG2
[1] => img10
[0] => img12
)Mises en garde et limitations
- Les clés sont préservées. Si vous avez besoin d'un index zéro propre après le tri, appelez
array_values($array)une fois le tri terminé. - Le tri s'effectue sur place. Le tableau est passé par référence ; n'écrivez pas
$x = natsort($arr)— cela stocke la valeur de retour booléenne, pas le tableau trié. - Sensible à la casse par défaut. Utilisez
natcasesort()lorsque la casse ne doit pas influencer l'ordre. - Tableaux uniquement.
natsort()ne fonctionne pas sur les chaînes ou les objets. Pour ordonner une chaîne délimitée, utilisezexplode()pour la convertir en tableau, triez, puisimplode()pour la reconstituer. - Comparaison par paires. En coulisse, elle utilise la même logique que
strnatcmp(); pour une règle personnalisée, triez avecusort()et votre propre comparateur.
Conclusion
natsort() trie un tableau en ordre naturel convivial, en traitant les chiffres intégrés comme des valeurs numériques tout en préservant les clés du tableau. Utilisez-la pour les noms de fichiers, les chaînes de version et toute liste mélangeant texte et chiffres — passez à natcasesort() lorsque la casse n'a pas d'importance, et pensez à réindexer avec array_values() si vous avez besoin de clés séquentielles. Pour d'autres besoins de tri, explorez les fonctions de tri de tableaux associées.