Trier un tableau par valeur de colonne en PHP : guide complet

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Pourquoi trier des tableaux associatifs est un casse-tête (et comment y remédier)

\n\n

Imaginez : vous avez extrait une liste d'utilisateurs depuis une base de données. Chacun a un nom, un âge, une ville, un score. Les données arrivent sous forme d'un tableau de tableaux associatifs. Et là, votre chef vous dit : « Trie par âge, puis par score en ordre décroissant ». Une situation familière ? Si vous avez déjà codé en PHP, vous avez forcément rencontré ce défi : trier un tableau de tableaux associatifs par valeur de colonne. Une question avec des milliers de vues sur Stack Overflow ne ment pas — c'est un vrai point de blocage pour de nombreux développeurs.

\n\n

Dans cet article, nous allons explorer toutes les méthodes pour trier des tableaux multidimensionnels en PHP. Du simple usort au puissant array_multisort. Vous apprendrez à trier par un seul champ, par plusieurs champs, dans différents ordres, et comment éviter les pièges liés aux types de données. C'est parti !

\n\n

Le problème : pourquoi la fonction sort() ne fonctionne pas

\n\n

Prenons ce tableau :

\n\n
<?php\n$users = [\n    ['name' => 'Anna', 'age' => 25, 'rating' => 4.7],\n    ['name' => 'Ivan', 'age' => 30, 'rating' => 3.9],\n    ['name' => 'Marie', 'age' => 22, 'rating' => 4.9],\n];\n?>
\n\n

Si vous essayez sort($users), PHP affichera un avertissement et laissera le tableau intact. Pourquoi ? Parce que sort() compare les éléments directement, et PHP ne sait pas comment comparer des tableaux associatifs. Il a besoin d'une indication — quel champ doit servir de critère de tri.

\n\n

Méthode n°1 : usort() — le roi du tri personnalisé

\n\n

La fonction usort() prend un tableau et une fonction de rappel (callback) qui compare deux éléments. C'est la méthode la plus flexible et la plus utilisée.

\n\n

Tri par un seul champ (ordre croissant)

\n\n
<?php\nusort($users, function($a, $b) {\n    return $a['age'] <=> $b['age'];\n});\n// Résultat : Marie (22), Anna (25), Ivan (30)\n?>
\n\n

L'opérateur <=> (vaisseau spatial) est apparu dans PHP 7 et rend le code plus propre. Il retourne -1, 0 ou 1 selon la comparaison. Pour un ordre décroissant, inversez simplement $a et $b :

\n\n
<?php\nusort($users, function($a, $b) {\n    return $b['age'] <=> $a['age'];\n});\n// Résultat : Ivan (30), Anna (25), Marie (22)\n?>
\n\n

Tri par un champ texte

\n\n

Avec les chaînes, cela fonctionne de la même manière, mais il est important de penser à la locale. Si vous triez des noms français, utilisez setlocale() et strcoll() pour un traitement correct des accents :

\n\n
<?php\nsetlocale(LC_ALL, 'fr_FR.UTF-8');\nusort($users, function($a, $b) {\n    return strcoll($a['name'], $b['name']);\n});\n?>
\n\n

Méthode n°2 : array_multisort() — pour trier sur plusieurs colonnes

\n\n

Lorsque vous devez trier d'abord par un champ, puis par un autre (par exemple, par ville, puis par âge dans chaque ville), usort commence à nécessiter une logique complexe. C'est là que array_multisort() entre en jeu.

\n\n

Tri par deux champs

\n\n
<?php\n$ages = array_column($users, 'age');\n$ratings = array_column($users, 'rating');\narray_multisort($ages, SORT_ASC, $ratings, SORT_DESC, $users);\n?>
\n\n

Décortiquons la magie : nous créons des tableaux séparés à partir des colonnes souhaitées, puis nous les passons à array_multisort. Important : le tableau d'origine est passé en dernier — il sera réorganisé selon l'ordre des premiers tableaux. C'est un outil puissant mais dangereux : si les colonnes ont des longueurs différentes, vous obtiendrez une erreur.

\n\n

Méthode n°3 : array_column() + sort() — l'astuce en une ligne

\n\n

Si vous avez simplement besoin de trier un tableau par un champ numérique unique, vous pouvez combiner array_column() et array_multisort() en une seule ligne :

\n\n
<?php\narray_multisort(array_colum                

Blogs

Book Recommendations