Articles
This document is also available in English
En SQL, il existe une bien pratique pour effectuer des tris ORDER BY. Et en PHP?
En PHP, il y a d'abord la collection des fonctions de tri : *sort. Ce sont des fonctions qui trient sur place, comme ceci :
<?php $tableau = array(3,45,6,7,3,2,); sort($tableau); // maintenant, $tableau est trié ?>
| Valeurs | Clés | Valeurs avec clés | |
| Direct | sort() | ksort() | asort() |
| Inverse | rsort() | krsort() | arsort() |
| Utilisateur | usort()uksort() | uasort() |
Avec cette table, vous pouvez tout garder en mémoire avec quelques préfixes : '' (rien), pour les tris sur les valeurs, a pour garder la clé associée et k pour trier sur les clés.
ensuite, '' (rien) pour faire un tri direct, r pour faire un tri inverse, et u pour faire un tri à l'aide d'une fonction utilisateur de tri. Cette dernière n'a pas de fonction de tri inverse, puisqu'il suffit de modifier la fonction de tri pour retourner le contraire, et le tri inverse sera fait.
Contrairement à SQL, PHP propose une autre fonction de tri intéressante : natsort(), qui est le tri naturel. Le tri naturel est le tri qu'un être humain ferait en lisant les valeurs et en les interprétant, plutôt qu'en utilisant les valeurs de chaque caractère.
Par exemple, le tableau ci-dessous rassemble des noms de photos, produites par un appareil photo numérique. Il dispose d'un compteur interne, pour ne pas générer deux fois le même nom de photos.
<?php $tableau = array("DSCN8.JPG", "DSCN14.JPG", "DSCN1546.JPG", "DSCN094.JPG"); sort($tableau); print_r($tableau); natsort($tableau); print_r($tableau); ?>
Le résultat est alors :
Array ( [0] => DSCN094.JPG [1] => DSCN14.JPG [2] => DSCN1546.JPG [3] => DSCN8.JPG ) Array ( [0] => DSCN094.JPG [3] => DSCN8.JPG [1] => DSCN14.JPG [2] => DSCN1546.JPG )
Dans le premier cas, les noms sont classés dans l'ordre d'importance des chiffres qui apparaissent à la même position : 0 avant 1 avant 9. Dans le deuxième cas, ce sont les nombres qui sont pris en compte : 8 avant 14 avant 1546. Notez simplement le cas de 094, où l'algorithme ne comprend pas que c'est 94.
Un avantage de la clause ORDER BY, c'est qu'elle permet de classer les colonnes avec un effet de cascade. Quand on indique plusieurs colonnes de tri, le tri se fait en priorité avec la première colonne citée. En cas d'égalité, ORDER BY passe à la deuxième colonne, et tente de départager les ex aequo avec leur valeur.
De plus, le tri de ORDER BY garde les lignes cohérentes : toutes les valeurs qui sont rassemblées sur une ligne sont toujours rassemblées après le tri. En PHP, on travaille sur un tableau, et on est capable de garder la relation avec les clés : ca fait déjà deux colonnes. Mais pourrait-on faire la même chose pour plus de deux colonnes de valeurs?
C'est exactement le travail d'array_multisort(). Cette fonction prend plusieurs tableaux, et les classes en même temps. Le classement se fait à l'aide du premier tableau, et, en cas d'égalité, c'est le deuxième tableau qui prend le relais.
<?php $t1 = array(2,3,5,7,11); $t2 = array('deux','trois','cinq','sept','onze'); $t3 = array(5=> 'zwei','drei','fünf','sieben','elf'); array_multisort($t2, $t1, $t3); print_r($t1); print_r($t2); print_r($t3); ?>
Cet exemple affiche :
Array ( [0] => 5 [1] => 2 [2] => 11 [3] => 7 [4] => 3 ) Array ( [0] => cinq [1] => deux [2] => onze [3] => sept [4] => trois ) Array ( [0] => fünf [1] => zwei [2] => elf [3] => sieben [4] => drei )
A noter
- natcasesort() fait le même tri, en ignorant la casse des caractères
- array_multisort() ne prend pas en compte les index : il suffit alors de découper un tableau clé => valeur en deux tableaux.
- array_multisort() fonctionne très bien avec les références : pas besoin de se casser la tête pour découper un tableau multidimensionnel, et faire un tri avec.
- array_multisort() accepte aussi des arguments pour indiquer le type de scalaire qui doit être trié (nombre, texte ou au choix), et l'ordre du tri (ascendant, descendant).
| < Précédent | Suivant > |
|---|
Commentaires
Vous pouvez ajouter votre commentaire! |
Vous devez vous connecter pour commenter


