Tableaux:Tri suivant des fonctions utilisateur

Un article de WikiTuto.

Jump to: navigation, search

Sommaire

Explication

Ces fonctions de tri opèrent sur l'ordre alphabétique ou numérique des valeurs. Pour faire des tris complexes, il faut utiliser les fonctions de tris basées sur des fonctions utilisateur. Basiquement, pour trier plusieurs valeurs, il suffit de pouvoir comparer deux valeurs. Pour faire un tri suivant un ordre défini par l'utilisateur, il suffit donc de fournir une fonction de comparaison de deux éléments. Les fonctions de tri utilisateur sont usort() pour les tableaux ordinaires et uksort(), uasort() pour les tableaux associatifs.

Exemple

L'exemple suivant montre comment faire un tri basé sur le troisième caractère de l'élément. Le tableau contient un ensemble de prénoms masculins, l'idée est de faire le tri en ne tenant pas compte des caractères accentués. Voici le code correspondant :

<?php
function replace_car($a) {
if ((($a >= "a") and ($a <="z"))
or (($a >= "A") and ($a <="Z"))) {
  return $a ;
 }

// Il en manque, c'est juste pour l'exemple...
switch($a) {
	case "é" :
		return "e"; break;  
	case "è" :
		return "e"; break;  
	case "ê" :
		return "e"; break;  
	case "à" :
		return "a"; break;  
	case "î" :
		return "i"; break;  
	case "ï" :
		return "i"; break;  
	case "ô" :
		return "o"; break;  
 } 
}
function cmp($a,$b) {
   $car_a = replace_car($a[2]);
   $car_b = replace_car($b[2]);
   if ($car_a == $car_b) return 0;
   return ($car_a < $car_b) ? -1 : 1;
}
$a = array("Jean","Gilles","Louis","Paul","Albert","Stéphane","Michel","Loïc");
usort($a, cmp);
while(list($key,$value) = each($a)) {
   echo "
($value[2]) $key: $value\n"; } ?>

Ce qui produit les résultats suivants :

(a) 0: Jean 
(b) 1: Albert 
(c) 2: Michel 
(é) 3: Stéphane 
(ï) 4: Loïc
(l) 5: Gilles 
(u) 6: Paul 
(u) 7: Louis 

Pour effectuer le tri dans l'ordre inverse, il suffit de définir la fonction une comparaison inverse :

<?php
function rcmp($a,$b) {
   $car_a = replace_car($a[2]);
   $car_b = replace_car($b[2]);
   if ($car_a == $car_b) return 0;
   return ($car_a > $car_b) ? -1 : 1;
}

Voir aussi

Source

Boîte à outils
Annuaire gratuitCe site est listé dans la catégorie Informatique : Aide et astuces en informatique Annuaire