La magie du tri : comment PHP ordonne les tableaux bidimensionnels
\n\nImaginez : vous avez un tableau de données — une liste d'utilisateurs, de produits ou de commandes. Vous devez le trier par âge, prix ou date. Dans Excel, cela se fait en un clic. Et en PHP ? C'est là que ça devient intéressant. La question "Sort a 2d array by a column value" sur Stack Overflow a recueilli des milliers de vues non sans raison — c'est l'une de ces tâches que chaque développeur rencontre.
\n\nAujourd'hui, nous ne nous contenterons pas de donner du code prêt à l'emploi. Nous allons regarder "sous le capot" de PHP et comprendre comment fonctionnent réellement les mécanismes de tri d'un tableau multidimensionnel. Vous découvrirez pourquoi usort est plus rapide que les boucles, comment PHP compare les éléments et quels pièges attendent le débutant. C'est parti !
Le problème : pourquoi le tri d'un tableau 2D n'est-il pas trivial ?
\n\nPHP dispose de sort() et asort() pour les tableaux unidimensionnels. Mais lorsque le tableau devient bidimensionnel (tableau de tableaux), les fonctions standard échouent. Pourquoi ? Parce que PHP ne sait pas sur quelle "colonne" (clé du tableau interne) vous souhaitez trier.
Voici un exemple typique :
\n\n<?php\n$users = [\n ['name' => 'Анна', 'age' => 25],\n ['name' => 'Иван', 'age' => 30],\n ['name' => 'Мария', 'age' => 22]\n];\n// Comment trier par âge ?\n?>\n\nAppeler simplement sort($users) ? Non — PHP émettra un avertissement et ne fera pas ce qu'il faut. Une approche plus intelligente est nécessaire.
Solution n°1 : usort classique avec une fonction personnalisée
\n\nLa méthode la plus populaire consiste à utiliser usort(). Cette fonction prend un tableau et une fonction de callback qui détermine l'ordre de tri. Analysons-la "sous le capot".
Comment fonctionne usort ?
\n\nLorsque vous appelez usort($array, $callback), PHP fait ce qui suit :
- \n
- Il divise le tableau en paires d'éléments. \n
- Pour chaque paire, il appelle votre fonction de callback. \n
- Le callback doit retourner : un nombre négatif (si le premier élément est "plus petit"), zéro (s'ils sont égaux), un nombre positif (si le premier est "plus grand"). \n
- Sur la base de ces réponses, PHP réorganise les éléments en utilisant l'algorithme de tri rapide (Quicksort) ou un hybride. \n
Voici à quoi cela ressemble en code :
\n\n<?php\n$users = [\n ['name' => 'Анна', 'age' => 25],\n ['name' => 'Иван', 'age' => 30],\n ['name' => 'Мария', 'age' => 22]\n];\n\nusort($users, function($a, $b) {\n return $a['age'] - $b['age'];\n});\n\nprint_r($users);\n// Résultat : Мария (22), Анна (25), Иван (30)\n?>\n\nRemarquez : nous soustrayons l'âge de $b de celui de $a. Si $a['age'] est plus petit — le résultat est négatif, l'élément $a vient en premier. Simple comme bonjour.
Piège : les chaînes de caractères et la sensibilité à la casse
\n\nSi vous triez par un champ de type chaîne (par exemple, le nom), la soustraction ne fonctionnera pas. Il faut utiliser strcmp() ou strcasecmp() pour un tri insensible à la casse :
<?php\nusort($users, function($a, $b) {\n return strcmp($a['name'], $b['name']);\n});\n// Tri par nom (Анна, Иван, Мария)\n?>\n\nMais attention : strcmp() est sensible à la casse. "apple" et "Apple" seront considérés comme différents. Si cela est critique — utilisez strcasecmp().
Solution n°2 : array_multisort — puissant mais délicat
\n\nLa deuxième méthode populaire est array_multisort(). Cette fonction peut trier plusieurs tableaux à la fois ou un tableau multidimensionnel par une seule colonne. "Sous le capot", elle fonctionne différemment : elle extrait la colonne, la trie, puis réorganise les autres tableaux dans le même ordre.
Voici à quoi cela ressemble :
\n\n<?php\n$users = [\n ['name' => 'Анна', 'age' => 25],\n ['name' => 'Иван', 'age' => 30],\n ['name' => 'Мария', 'age' => 22]\n];\n\n// Obtenir la colonne des âges\n$ages = array_column($users, 'age');\n\n// Trier les utilisateurs par âge\narray_multisort($ages, SORT_ASC, $users);\n\nprint_r($users);\n// Résultat : Мария (22), Анна (25), Иван (30)\n?>\n\nCette méthode est plus concise, mais elle crée un tableau supplémentaire pour les âges. Pour les grands ensembles de données, cela peut consommer plus de mémoire. De plus, array_multisort modifie les tableaux passés par référence — soyez prudent avec les copies.
Comparaison des performances : usort vs array_multisort
\n\nLequel est le plus rapide ? Cela dépend de la situation. usort est généralement plus efficace pour les tableaux de taille moyenne (jusqu'à 10 000 éléments), car il ne crée pas de tableaux supplémentaires. array_multisort peut être plus lent en raison de la copie des données, mais il est plus pratique pour les structures complexes.
Testez sur vos données : parfois la différence est négligeable, parfois elle est significative. L'essentiel est de choisir l'outil adapté à la tâche.
\n\nConclusion : maîtrisez le tri en PHP
\n\nNous avons analysé les mécanismes internes du tri des tableaux 2D en PHP. usort offre une flexibilité maximale, array_multisort — de la concision. L'essentiel est de comprendre comment PHP compare les éléments et quels pièges éviter.
N'oubliez pas : la clé d'un bon code n'est pas seulement la solution, mais la compréhension de son fonctionnement. Maintenant que vous savez ce qui se passe "sous le capot", vous pouvez trier n'importe quel tableau en toute confiance. Bon codage !