Subversion Repositories eFlore/Applications.eflore-consultation

Rev

Rev 147 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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