Subversion Repositories eFlore/Applications.eflore-consultation

Rev

Rev 147 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

<?php
// declare(encoding='UTF-8');
/**
 * Classe fournissant des méthodes de trie de tableaux (Array).
 *
 * @category    PHP 5.2
 * @package             eFlore/Bibliotheque
 * @author              Jean-Pascal MILCENT <jpm@tela-botanica.org>
 * @copyright   Copyright (c) 2009, Tela Botanica (accueil@tela-botanica.org)
 * @license             http://www.gnu.org/licenses/gpl.html Licence GNU-GPL-v3
 * @license             http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL-v2
 * @version             $Id$
 */
// TODO : réaliser une seule méthode pour trierMD et trierMDType
class Trieur {
        const TRI_NATUREL = 'nat';
        const TRI_CASSE_SENSIBLE = 'ci';
        const TRI_CASSE_INSENSIBLE = 'ci';

        private $manipulateurDeChaine = null;
        private $tableau = array();
        private $champsEtOrdres = array();
        private $triType = self::TRI_NATUREL;

        public function __construct(Array $tableau = null, ChaineManipulateur $manipulateurDeChaine = null) {
                if (is_array($tableau)) {
                        $this->setTableau($tableau);
                }
                $this->manipulateurDeChaine = is_null($tableau) ? new ChaineManipulateur() : $manipulateurDeChaine;
        }

        public function setTableau($tableau) {
                $this->tableau = $tableau;
        }
        /**
        * Fournir un tableau contenant en clé les noms des champs et en valeur l'ordre de tri. Exemple :
        * array('ma_cle1' => SORT_ASC, 'ma_cle2' => SORT_DESC), $type_de_tri);
        * Utiliser les constantes php SORT_DESC ou SORT_ASC pour l'odre de tri.
        * @param array  en clé les noms des champs et en valeur l'ordre de tri.
        */
        public function setChampsEtOrdres($champsEtOrdres) {
                $this->champsEtOrdres = $champsEtOrdres;
        }
        /**
        * Pour le type de tri : utiliser :
        *  - Trieur::TRI_NATUREL pour un tri naturel,
        *  - Tableau::TRI_CASSE_SENSIBLE pour un tri sensible à la casse,
        *  - Tableau::TRI_CASSE_INSENSIBLE pour un tri insensible à la casse.
        * @param string le type de tri à appliquer.
        */
        public function setTriType($type) {
                $this->triType = $type;
        }

        /**
        * Méthode réalisant un tri d'un tableau multidimension. Attention les clés du tableau ne sont pas modifiées.
        * A utiliser de cette façon:
        * EfloreTriage::trieMultiple( $tableau_multidimension, array('ma_cle1' => SORT_ASC, 'ma_cle2' => SORT_DESC), $type_de_tri);
        * Utiliser les constantes php SORT_DESC ou SORT_ASC pour l'odre de tri.

        * @param array le tableau à trier
        * @param array le tableau des colonnes à trier qui a des noms de clés pour clés et des ordres de tri pour valeurs.
        * @param string le type de tri à appliquer.
        * @return array le tableau trié.
        */
        public function trier() {
                uasort($this->tableau, array($this, 'comparer'));
                return $this->tableau;
        }

        public function comparer($a, $b) {
                $resultat = 0;
                foreach ($this->champsEtOrdres as $champ => $ordre) {
                        if ($resultat == 0) {
                                $mot_01 = $this->manipulateurDeChaine->supprimerAccents($b[$champ]);
                                $mot_02 = $this->manipulateurDeChaine->supprimerAccents($a[$champ]);
                                switch ($this->triType) {
                                        case self::TRI_NATUREL :
                                                $resultat = ($ordre == SORT_DESC) ? strnatcmp($mot_01, $mot_02) : strnatcmp($mot_02, $mot_01);
                                                break;
                                        case self::TRI_CASSE_SENSIBLE :
                                                $resultat = ($ordre == SORT_DESC) ? strcmp($mot_01, $mot_02) : strcmp($mot_02, $mot_01);
                                                break;
                                        case self::TRI_CASSE_INSENSIBLE :
                                                $resultat = ($ordre == SORT_DESC) ? strcasecmp($mot_01, $mot_02) : strcasecmp($mot_02, $mot_01);
                                                break;
                                        default:
                                                $resultat = ($ordre == SORT_DESC) ? strcasecmp($mot_01, $mot_02) : strcasecmp($mot_02, $mot_01);
                                                break;
                                }

                        }
                }
                return $resultat;
        }
}
?>