Subversion Repositories eFlore/Applications.eflore-consultation

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
147 jpm 1
<?php
2
// declare(encoding='UTF-8');
3
/**
4
 * Classe fournissant des méthodes de trie de tableaux (Array).
5
 *
6
 * @category	PHP 5.2
7
 * @package		eFlore/Bibliotheque
8
 * @author		Jean-Pascal MILCENT <jpm@tela-botanica.org>
9
 * @copyright	Copyright (c) 2009, Tela Botanica (accueil@tela-botanica.org)
10
 * @license		http://www.gnu.org/licenses/gpl.html Licence GNU-GPL-v3
11
 * @license		http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL-v2
12
 * @version		$Id$
13
 */
14
// TODO : réaliser une seule méthode pour trierMD et trierMDType
15
class Trieur {
16
	const TRI_NATUREL = 'nat';
17
	const TRI_CASSE_SENSIBLE = 'ci';
18
	const TRI_CASSE_INSENSIBLE = 'ci';
19
 
20
	private $manipulateurDeChaine = null;
21
	private $tableau = array();
22
	private $champsEtOrdres = array();
23
	private $triType = self::TRI_NATUREL;
24
 
25
	public function __construct(Array $tableau = null, ChaineManipulateur $manipulateurDeChaine = null) {
26
		if (is_array($tableau)) {
27
			$this->setTableau($tableau);
28
		}
29
		$this->manipulateurDeChaine = is_null($tableau) ? new ChaineManipulateur() : $manipulateurDeChaine;
30
	}
31
 
32
	public function setTableau($tableau) {
33
		$this->tableau = $tableau;
34
	}
35
	/**
36
	* Fournir un tableau contenant en clé les noms des champs et en valeur l'ordre de tri. Exemple :
37
	* array('ma_cle1' => SORT_ASC, 'ma_cle2' => SORT_DESC), $type_de_tri);
38
	* Utiliser les constantes php SORT_DESC ou SORT_ASC pour l'odre de tri.
39
	* @param array  en clé les noms des champs et en valeur l'ordre de tri.
40
	*/
41
	public function setChampsEtOrdres($champsEtOrdres) {
42
		$this->champsEtOrdres = $champsEtOrdres;
43
	}
44
	/**
45
	* Pour le type de tri : utiliser :
46
	*  - Trieur::TRI_NATUREL pour un trie naturel,
47
	*  - Tableau::TRI_CASSE_SENSIBLE pour un tri sensible à la casse,
48
	*  - Tableau::TRI_CASSE_INSENSIBLE pour un tri insensible à la casse.
49
	* @param string le type de tri à appliquer.
50
	*/
51
	public function setTriType($type) {
52
		$this->triType = $type;
53
	}
54
 
55
	/**
56
	* Méthode réalisant un tri d'un tableau multidimension. Attention les clés du tableau ne sont pas modifiées.
57
	* A utiliser de cette façon:
58
	* EfloreTriage::trieMultiple( $tableau_multidimension, array('ma_cle1' => SORT_ASC, 'ma_cle2' => SORT_DESC), $type_de_tri);
59
	* Utiliser les constantes php SORT_DESC ou SORT_ASC pour l'odre de tri.
60
 
61
	* @param array le tableau à trier
62
	* @param array le talbeau des colonnes à trier constituer de nom de clé en clé et d'ordres de tri en valeur.
63
	* @param string le type de tri à appliquer.
64
	* @return array le tableau trié.
65
	*/
66
	public function trier() {
67
		uasort($this->tableau, array($this, 'comparer'));
68
		return $this->tableau;
69
	}
70
 
71
	public function comparer($a, $b) {
72
		$resultat = 0;
73
		foreach ($this->champsEtOrdres as $champ => $ordre) {
74
			if ($resultat == 0) {
75
				$mot_01 = $this->manipulateurDeChaine->supprimerAccents($b[$champ]);
76
				$mot_02 = $this->manipulateurDeChaine->supprimerAccents($a[$champ]);
77
				switch ($this->triType) {
78
					case self::TRI_NATUREL :
79
						$resultat = ($ordre == SORT_DESC) ? strnatcmp($mot_01, $mot_02) : strnatcmp($mot_02, $mot_01);
80
						break;
81
					case self::TRI_CASSE_SENSIBLE :
82
						$resultat = ($ordre == SORT_DESC) ? strcmp($mot_01, $mot_02) : strcmp($mot_02, $mot_01);
83
						break;
84
					case self::TRI_CASSE_INSENSIBLE :
85
						$resultat = ($ordre == SORT_DESC) ? strcasecmp($mot_01, $mot_02) : strcasecmp($mot_02, $mot_01);
86
						break;
87
					default:
88
						$resultat = ($ordre == SORT_DESC) ? strcasecmp($mot_01, $mot_02) : strcasecmp($mot_02, $mot_01);
89
						break;
90
				}
91
 
92
			}
93
		}
94
		return $resultat;
95
	}
96
}
97
?>