Il est toujours plus facile de saisir une information spécifique à partir de données triées, sinon vous devez parcourir chaque élément du tableau un à la fois. Par exemple, disons que vous avez stocké le score de différents élèves d’une classe dans un tableau ou une table. Si les données ne sont pas triées en fonction des résultats obtenus, vous devrez examiner le score de chaque élève de la classe avant de pouvoir dire qui a obtenu le score le plus élevé et le plus bas. Si le tableau était déjà trié de bas en haut sur la base des scores, il suffit de regarder le score du premier élève pour trouver la note la plus basse.

Le tri rend beaucoup de tâches qui nécessitent l’accès ou l’obtention d’un ensemble spécifique de données très facile et efficace. Dans ce tutoriel, nous allons apprendre comment utiliser les fonctions PHP intégrées pour trier différents types de tableaux.

Tri d’un tableau par valeur

Trier un tableau par la valeur de ses éléments est très facile en PHP. Vous pouvez choisir de gérer ou de supprimer les associations clé-valeur et vous pouvez également définir vos propres fonctions pour dicter la façon dont les éléments sont triés. Je vais vous montrer comment dans cette section du tutoriel.

Vous pouvez utiliser la fonction sort(&$array, $sort_flags) pour trier les valeurs d’un tableau de bas en haut. Cependant, il ne conservera aucune association clé-valeur lors du tri du tableau. Les nouvelles clés sont assignées à des éléments triés au lieu d’un simple réordonnancement. Le deuxième paramètre optionnel vous permet de spécifier comment les éléments doivent être triés. Il peut avoir six valeurs différentes :

  • SORT_REGULAR (TRIER_REGULIER) : permet de trier les valeurs sans changer leur type.
  • SORT_NUMERIC-Trier les valeurs en les comparant numériquement.
  • SORT_STRING (TRIER_STRING) : cette option permet de trier les valeurs en les comparant sous forme de chaînes de caractères.
  • SORT_LOCALE_STRING (Trier_LOCALE_STRING) : compare les valeurs sous forme de chaîne en fonction de la locale courante. Vous pouvez mettre à jour la locale vous-même en utilisant setlocale().
  • SORT_NATURAL- Ceci va trier les éléments en utilisant “l’ordre naturel” tout en les comparant sous forme de chaînes.
  • SORT_FLAG_CASE- Ceci peut être combiné avec SORT_STRING ou SORT_NATURAL pour désactiver la sensibilité à la casse lors du tri des chaînes.

Voici quelques exemples de tri pour vous aider à saisir rapidement la différence entre tous les drapeaux de tri.

<?php
 
$airport_count = ["United States" => 13513, "Brazil" => 4093, "Mexico" => 1714, "Canada" => 1467, "Russia" => 1218, "Argentina" => 1138, "Bolivia" => 855, "Colombia" => 836, "Paraguay" => 799, "Indonesia" => 673];
 
ksort($airport_count);
 
foreach($airport_count as $country=>$count) {
    echo str_pad($country, 15)." ".$count."\n";
}
 
/*
Argentina       1138
Bolivia         855
Brazil          4093
Canada          1467
Colombia        836
Indonesia       673
Mexico          1714
Paraguay        799
Russia          1218
United States   13513
*/
 
?>

Dans l’exemple, le tri régulier, les chaînes numériques sont converties en leurs valeurs numériques et le tri est effectué en conséquence. La chaîne “Apple” n’est pas numérique, elle est donc laissée intacte et comparée comme une chaîne.

Dans le deuxième exemple, le tri numérique, nous voulons que les données soient triées en fonction de la valeur numérique de sorte que “Apple” soit converti à la valeur numérique 0 et vienne en premier. Les autres valeurs sont triées comme prévu.

Dans le troisième exemple, toutes les valeurs sont traitées comme des chaînes de caractères. Cela signifie qu’au lieu de comparer la valeur numérique de 123 ou 3249832 avec 38, ils sont comparés comme des chaînes de caractères un caractère à la fois. Puisque “1” précède “3”, la valeur 123 est considérée comme inférieure à 38.

Si vous voulez trier les valeurs de votre tableau de haut en bas au lieu de bas en haut, vous pouvez le faire à l’aide de la fonction rsort(). Il accepte tous les mêmes paramètres que sort() mais trie les valeurs dans l’ordre inverse. Il ne maintient pas non plus d’associations clé-valeur, ce n’est donc pas un bon choix pour trier les tableaux associatifs.

Trier un tableau associatif

Les associations de valeurs clés deviennent importantes lorsque vous avez affaire à des tableaux associatifs. Considérons l’exemple suivant où un tableau associatif est utilisé pour stocker le nom de différentes personnes et leur fruit préféré. Si vous voulez trier la liste par ordre alphabétique du nom des fruits, l’utilisation de la fonction sort() de la section précédente entraînera la perte des clés associées.

<?php
 
$fruit_preferences = ["James" => "Orange", "John" => "Banana", "Patricia" => "Apple", "Jennifer" => "Mango", "Mary" => "Grapes"];
 
echo "Before Sorting — \n";
foreach($fruit_preferences as $person=>$preference) {
    echo $person." likes ".$preference."\n";
}
 
/*
Before Sorting — 
James likes Orange
John likes Banana
Patricia likes Apple
Jennifer likes Mango
Mary likes Grapes
*/
 
sort($fruit_preferences);
 
echo "After Sorting  — \n";
foreach($fruit_preferences as $person=>$preference) {
    echo $person." likes ".$preference."\n";
}
 
/*
After Sorting  — 
0 likes Apple
1 likes Banana
2 likes Grapes
3 likes Mango
4 likes Orange
*/
 
?>

Comme vous pouvez le remarquer, on a perdu les noms des différentes personnes. Chaque valeur triée s’est vu attribuer un nouvel index numérique en fonction de sa position dans le tableau trié.

Pour vous aider à résoudre ce problème facilement, PHP a deux fonctions différentes qui maintiennent l’association clé-valeur tout en triant les tableaux par leurs valeurs. Ces deux fonctions sont asort() et arsort(). L’extrait de code suivant trie le même tableau $fruit_preferences mais utilise asort() pour le faire.

<?php
 
$fruit_preferences = ["James" => "Orange", "John" => "Banana", "Patricia" => "Apple", "Jennifer" => "Mango", "Mary" => "Grapes"];
 
echo "Before Sorting — \n";
foreach($fruit_preferences as $person=>$preference) {
    echo $person." likes ".$preference."\n";
}
 
/*
Before Sorting — 
James likes Orange
John likes Banana
Patricia likes Apple
Jennifer likes Mango
Mary likes Grapes
*/
 
asort($fruit_preferences);
 
echo "After Sorting  — \n";
foreach($fruit_preferences as $person=>$preference) {
    echo $person." likes ".$preference."\n";
}
 
/*
After Sorting  — 
Patricia likes Apple
John likes Banana
Mary likes Grapes
Jennifer likes Mango
James likes Orange
*/
 
?>

Comme le montre l’exemple ci-dessus, la valeur d’Apple monte en haut de l’échelle tout en maintenant son association avec Patricia. Les noms des fruits pourraient être triés à l’envers tout aussi facilement en utilisant la fonction arsort().

Ces deux fonctions acceptent les mêmes indicateurs de tri que la valeur de leur second paramètre optionnel comme sort() et rsort().

Tri des éléments de tableau par valeur avec fonctions définies par l’utilisateur

Les quatre fonctions de tri peuvent facilement gérer vos besoins de tri courants à l’aide de différents drapeaux. Cependant, vos critères de comparaison des éléments du tableau peuvent parfois être différents.

Disons que vous avez un tableau de mots aléatoires qui doivent être triés par ordre alphabétique. Toutefois, vous souhaitez également les trier en fonction de leur longueur avant de les trier par ordre alphabétique. Par exemple, le zoo viendrait après la pomme dans le tri alphabétique traditionnel. Cependant, si vous voulez afficher les mots courts avant les mots plus longs, le zoo apparaîtra avant apple. Dans le même ensemble de lettres, le singe venait avant le zoo en raison de l’ordre alphabétique.

Fondamentalement, les mots sont d’abord triés en fonction de leur longueur, puis les mots ayant le même nombre de lettres sont triés alphabétiquement dans leur propre groupe. Ce type de tri n’est pas intégré dans PHP, nous devrons donc écrire notre propre fonction de tri.

Ce que fait PHP dans ce cas est de vous fournir quelques fonctions qui peuvent être utilisées pour passer le tableau que vous voulez trier avec le nom de votre propre fonction de tri.

Vous pouvez utiliser la fonction usort() pour trier les valeurs des tableaux dans les tableaux réguliers. De même, vous pouvez utiliser la fonction uasort() pour trier les valeurs dans les tableaux associatifs tout en conservant les associations clé-valeur.

L’extrait de code ci-dessous montre une façon d’accomplir ce comportement.

<?php
 
$random_words = ["ape", "apple", "zoo", "pie", "elephant", "banana", "picnic", "eye"];
 
sort($random_words);
echo "Regular Sort Function: \n";
foreach($random_words as $element) {
    echo str_pad($element, 9)." ";
}
 
/*
Regular Sort Function: 
ape       apple     banana    elephant  eye       picnic    pie       zoo
*/
 
function custom_sort($word_a, $word_b) {
    if (strlen($word_a) < strlen($word_b)) {
        return -1;
    }
    if (strlen($word_a) == strlen($word_b)) {
        return strcmp($word_a, $word_b);
    }
    if (strlen($word_a) > strlen($word_b)) {
        return 1;
    }
}
 
usort($random_words, "custom_sort");
echo "\nCustom Sort Function: \n";
foreach($random_words as $element) {
    echo str_pad($element, 9)." ";
}
 
/*
Custom Sort Function: 
ape       eye       pie       zoo       apple     banana    picnic    elephant
*/
 
?>

Dans les fonctions de rappel destinées au tri personnalisé, nous devons retourner un entier inférieur à 0 pour indiquer que la première valeur est inférieure à la seconde. Retourne 0 si la première valeur est égale à la seconde. Retourne un entier supérieur à 0 si la première valeur est supérieure à la seconde.

Comme notre critère de tri primaire était la longueur des chaînes de caractères, nous retournons directement -1 si le premier mot est plus court que le second. De même, nous retournons directement 1 si le premier mot est plus long que le second. Si les deux mots sont de longueur égale, nous les comparons alphabétiquement en utilisant la fonction strcmp() et retournons sa valeur.

Comme vous pouvez le voir dans le résultat, notre fonction de tri personnalisé réorganise les mots exactement comme nous le voulions.

Tri d’un tableau par clé

Trier un tableau en fonction de ses clés est généralement utile lorsque vous avez affaire à des tableaux associatifs. Par exemple, vous pouvez avoir un tableau avec des informations sur le nombre total d’aéroports dans différents pays. En supposant que les noms des différents pays sont des clés et que le nombre d’aéroports est une valeur, vous pouvez trier les noms de pays par ordre alphabétique. C’est très facile à faire avec les fonctions ksort() et krsort(). Ces deux fonctions maintiendront l’association clé-valeur des éléments du tableau après triage. La fonction ksort() trie les clés de bas en haut et krsort() trie les clés de haut en bas.

Voici un exemple de tri basique :

<?php
 
$airport_count = ["United States" => 13513, "Brazil" => 4093, "Mexico" => 1714, "Canada" => 1467, "Russia" => 1218, "Argentina" => 1138, "Bolivia" => 855, "Colombia" => 836, "Paraguay" => 799, "Indonesia" => 673];
 
ksort($airport_count);
 
foreach($airport_count as $country=>$count) {
    echo str_pad($country, 15)." ".$count."\n";
}
 
/*
Argentina       1138
Bolivia         855
Brazil          4093
Canada          1467
Colombia        836
Indonesia       673
Mexico          1714
Paraguay        799
Russia          1218
United States   13513
*/
 
?>

Vous pouvez également fournir PHP sans votre propre fonction personnalisée pour trier les clés de tableau en utilisant la fonction uksort(). Tout comme usort(), la fonction de rappel dans uksort() vous demande aussi de retourner un entier inférieur à 0 si la première clé est considérée comme inférieure à la seconde et un entier supérieur à 0 si la première clé est supérieure à la seconde. Cette fonction maintient également l’association clé-valeur des éléments du tableau.

<?php
 
$airport_count = ["United States" => 13513, "Brazil" => 4093, "Mexico" => 1714, "Canada" => 1467, "Russia" => 1218, "Argentina" => 1138, "Bolivia" => 855, "Colombia" => 836, "Paraguay" => 799, "Indonesia" => 673];
 
function custom_sort($word_a, $word_b) {
    if (strlen($word_a) < strlen($word_b)) {
        return -1;
    }
    if (strlen($word_a) == strlen($word_b)) {
        return strcmp($word_a, $word_b);
    }
    if (strlen($word_a) > strlen($word_b)) {
        return 1;
    }
}
 
uksort($airport_count, "custom_sort");
 
foreach($airport_count as $country=>$count) {
    echo str_pad($country, 15)." ".$count."\n";
}
 
/*
Brazil          4093
Canada          1467
Mexico          1714
Russia          1218
Bolivia         855
Colombia        836
Paraguay        799
Argentina       1138
Indonesia       673
United States   13513
*/
 
?>

Dans l’exemple ci-dessus, nous avons utilisé la fonction de tri personnalisé de la section précédente pour trier le nom des pays d’abord par la longueur de leur nom et ensuite par ordre alphabétique.

Tri de tableaux multidimensionnels en PHP

Il est beaucoup plus courant dans la vie réelle de traiter des informations multidimensionnelles. Par exemple, les établissements enregistreront les notes de tous les étudiants dans une variété de matières dans un seul tableau au lieu de créer de nouveaux tableaux pour chaque matière. Si vous devez stocker les mêmes informations en PHP, vous préféreriez également le faire en utilisant un tableau multidimensionnel au lieu d’un tableau séparé pour chaque sujet.

Dans ce tutoriel, nous allons apprendre comment trier un tableau multidimensionnel en utilisant une liste des plus grands bâtiments du monde comme exemple. Notre tableau contiendra des informations sur le nom du bâtiment, la ville et le pays où il est situé, le nombre d’étages et la hauteur totale en mètres ainsi que l’année où il a été construit.

Lorsque vous voulez trier les valeurs dans un tableau multidimensionnel basé sur un champ particulier, vous pouvez simplement utiliser la fonction usort(). L’exemple ci-dessous devrait vous aider à mieux comprendre cette technique.

<?php
 
$tallest_buildings = [
    ["Building" => "Burj Khalifa","City" => "Dubai","Country" => "United Arab Emirates","Height" => 828,"Floors" => 163,"Year" => 2010],
    ["Building" => "Shanghai Tower","City" => "Shanghai","Country" => "China","Height" => 632,"Floors" => 128,"Year" => 2015],
    ["Building" => "Abraj Al-Bait Towers","City" => "Mecca","Country" => "Saudi Arabia","Height" => 601,"Floors" => 120,"Year" => 2012],
    ["Building" => "Ping An Finance Center","City" => "Shenzhen","Country" => "China","Height" => 599,"Floors" => 115,"Year" => 2017],
    ["Building" => "Lotte World Tower","City" => "Seoul","Country" => "South Korea" ,"Height" => 554,"Floors" => 123,"Year" => 2016]
];
 
function storey_sort($building_a, $building_b) {
    return $building_a["Floors"] - $building_b["Floors"];
}
 
usort($tallest_buildings, "storey_sort");
 
foreach($tallest_buildings as $tall_building) {
    list($building, $city, $country, $height, $floors) = array_values($tall_building);
    echo $building." is in ".$city.", ".$country.". It is ".$height." meters tall with ".$floors." floors.\n";
}
 
/*
Ping An Finance Center is in Shenzhen, China. It is 599 meters tall with 115 floors.
Abraj Al-Bait Towers is in Mecca, Saudi Arabia. It is 601 meters tall with 120 floors.
Lotte World Tower is in Seoul, South Korea. It is 554 meters tall with 123 floors.
Shanghai Tower is in Shanghai, China. It is 632 meters tall with 128 floors.
Burj Khalifa is in Dubai, United Arab Emirates. It is 828 meters tall with 163 floors.
*/
 
?>

Dans l’exemple ci-dessus, les informations sur chaque bâtiment sont stockées dans son propre tableau dans le tableau principal $tallest_buildings. La fonction storey_sort() soustrait simplement le nombre d’étages du deuxième bâtiment du premier pour déterminer quel bâtiment est plus petit selon nos critères. Nous n’avons pas à nous soucier de retourner une valeur négative ou positive spécifique parce que toutes les valeurs négatives signifient plus petites et toutes les valeurs positives signifient plus grandes.

En fin de compte, nous ne faisons qu’itérer le tableau principal et imprimer des informations sur chaque bâtiment.

Conclusion

Dans ce tutoriel, je vous ai montré quelques fonctions différentes en PHP qui peuvent être utilisées pour trier les tableaux soit par leurs clés soit par leurs valeurs. Nous avons également appris à trier un tableau par ses clés ou valeurs en utilisant nos propres critères de tri personnalisés à l’aide des fonctions uksort() et uasort(). La dernière section explique comment trier toutes les valeurs d’un tableau multidimensionnel en utilisant uniquement un champ spécifique.

J’espère que vous avez appris quelque chose de nouveau dans ce tutoriel. Si vous avez des questions ou des suggestions, n’hésitez pas à m’en faire part dans les commentaires. La meilleure façon d’apprendre est d’essayer de créer quelques exemples de vos propres tableaux de tri en utilisant ces fonctions.

Et si vous utilisez aussi javascript, je vous conseille d’aller jeter un oeil à mon article sur comment faire des boucles en javascript


siddhy

Développeur web full stack depuis une 15aine d'année dans une agence web du sud de la France et Geek depuis toujours, l'apprentissage et le partage font parti intégrante de ma philosophie au même titre que l'évolution personnelle et la sagesse bouddhiste.

0 commentaire

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *