Tri sur les tableaux en PHP

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.

Cette entrée a été publiée dans php. Vous pouvez la mettre en favoris avec ce permalien.

One Response to Tri sur les tableaux en PHP

  1. User dit :

    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!

Laisser un commentaire

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

*

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

*