Réaliser des tris en particulier sur des tableaux est une opération courante. Un ensemble de fonctions natives en PHP permettent de le réaliser simplement.
Tri basique avec sort
La fonction sort trie d’un tableau à une seule dimension dans l’ordre ascendant des éléments du tableau.
$tableau = array('concombre', 'pomme', 'banane');
sort($tableau);
/* le nouveau tableau */
array (
0 => 'banane',
1 => 'concombre',
2 => 'pomme',
)
Sort est sensible à la casse. Il est déconseillé de mélanger les types de données. La fonction sort ne réalise un tri sur des caractère ASCII. Elle ne prend pas spécifiquement en charge l’UTF8. Sort ne fait rien de très sophistiqué, pour faire des tri un peu plus évolué, la fonction usort permet de mettre en place une fonction de comparaison sur mesure.
La fonction, rsort réalise un tri dans l’ordre inverse.
A noter qu’un second paramètre rsort ( array &$array [, int $sort_flags = SORT_REGULAR ] ) permet de préciser le comportement du tri, voir la documentation de la fonction sort. La manière dont la fonction compare les éléments est très importante.
Tri d’un tableau à 2 dimensions avec usort
Il arrive souvent d’avoir à trier des tableau d’une structure similaire à ce qui suit :
$tableau = array(
array('id'=>1, 'text'=>'concombre'),
array('id'=>2, 'text'=>'pomme'),
array('id'=>3, 'text'=>'banane')
);
C’est le type de tableau qu’on va récupérer après un fetchAll sur un objet Zend_Db et un ensemble d’autres couches d’abstraction de base de données. La fonction php usort permet de réaliser un tri en faisant appel à une fonction de comparaison. Dans l’exemple qui suit la fonction « cmp » réalise la comparaison. La seule chose qui reste à faire c’est de réaliser le code qui permet de comparer le type de données présent dans la colonne sur laquelle on souhaite trier (chaîne sensible ou pas à la casse, tri naturel sur de l’UTF-8, entier, date sous différents formats, etc.).
function cmp($a, $b){
return strcmp($a['text'], $b['text']);
}
usort($tableau, 'cmp');
Exemple de tri d’un tableau par date
$tableau = array(
array('id'=>1, 'date'=>'01/02/2011', 'libelle'=>'...'),
array('id'=>2, 'date'=>'01/01/2010', 'libelle'=>'...'),
array('id'=>3, 'date'=>'01/05/2010', 'libelle'=>'...')
);
function cmp($a, $b){
/*
converti la date en entier aaaammjj
suppose qu'on est certain d'avoir une date au bon format
*/
$da = preg_replace('/^([0-9]{2})\/([0-9]{2})\/([0-9]{4})$/', '$3$2$1', $a['date']);
$db = preg_replace('/^([0-9]{2})\/([0-9]{2})\/([0-9]{4})$/', '$3$2$1', $b['date']);
return ($da == $db ? 0 : ($da > $db ? 1 : -1));
}
usort($tableau, 'cmp');
echo '<pre>'.var_export($tableau, true).'</pre>';
La documentation de usort fourni un exemple (exemple N°3) qui permet de créer une méthode objet qui permettrait en l’adaptant un peu de fournir une fonction de tri par colonne générique.
La documentation des fonctions de tri de tableaux sur php.net.
Après beaucoup de recherches et des dizaines de lignes de codes pour trier un tableau contenant des pourcentages, réduire tout ça en quelques lignes pour un meme resultat, mais un grand soucis d’optimisation! Bonne continuation!