8,19 → 8,26 |
* @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 |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL-v2 |
* @version $Id$ |
* @link /doc/framework/ |
*/ |
// TODO : réaliser une seule méthode pour trierMD et trierMDType |
class Tableau { |
const TRIE_NATUREL = 'nat'; |
const TRIE_CASSE_SENSIBLE = 'ci'; |
const TRIE_CASSE_INSENSIBLE = 'ci'; |
|
private static $triMultiDimension = null; |
private static $triType = null; |
|
/** |
* Etend le tableau à étendre avec les données du tableau à copier. Si des clés sont identiques entre les deux tableaux |
* une erreur est déclenchée et la valeur du tableau à étendre est gardée. Si les deux tableaux ont des clés numériques |
* une erreur est déclenchée et la valeur du tableau à étendre est gardée. Si les deux tableaux ont des clés numériques |
* leurs valeurs sont gardées (à la différence de array_merge). |
* Les tableaux sont passés par références et le tableau à copier est progressivement détruit pour éviter la consomation |
* de mémoire. |
* |
* |
* @param array $tableau_a_etendre |
* @param array $tableau_a_copier |
* @return void |
40,7 → 47,7 |
trigger_error($e, E_USER_WARNING); |
} |
} |
|
|
/** |
* @deprecated Utiliser la méthode trierMD() |
* @see trierMD() |
48,10 → 55,10 |
public static function trierTableauMd($array, $cols) { |
return self::trierMD($array, $cols); |
} |
|
|
/** |
* Permet de trier un tableau multi-dimenssionnel en gardant l'ordre des clés. |
* |
* |
* @param Array $array le tableau à trier |
* @param Array $cols tableau indiquant en clé la colonne à trier et en valeur l'ordre avec SORT_ASC ou SORT_DESC |
* @return Array le tableau trié. |
90,40 → 97,40 |
} |
return $ret; |
} |
|
|
/** |
* Méthode réalisant un tri d'un tableau multidimension. |
* A utiliser de cette façon: |
* EfloreTriage::trieMultiple( $tableau_multidimension, array('ma_cle1', 'ma_cle1_ordre_tri', 'ma_cle2', 'ma_cle2_ordre_tri'), $type_de_tri); |
* Utiliser les constantes php SORT_DESC ou SORT_ASC pour l'odre de tri. |
* Pour le type de tri : utiliser 'nat' pour un trie naturel, 'cs' pour tri sensible à la casse ou 'ci' pour insensible. |
* Pour le type de tri : utiliser Tableau::TRIE_NATUREL pour un trie naturel, Tableau::TRIE_CASSE_SENSIBLE pour tri sensible à la casse ou Tableau::TRIE_CASSE_INSENSIBLE pour insensible. |
* @param array le tableau à trier |
* @param array le talbeau des colonnes à trier constituer d'un suite de nom de clé de tableau et d'ordre de tri. |
* @return array le tableau trié. |
*/ |
public static function trierMDType(&$tableau, $cols, $type = 'ci') { |
self::$tri_multi_dimension = $cols; |
self::$tri_type = $type; |
public static function trierMDType(&$tableau, $cols, $type = self::TRIE_CASSE_INSENSIBLE) { |
self::$triMultiDimension = $cols; |
self::$triType = $type; |
usort($tableau, array('self', 'comparer')); |
return $tableau; |
} |
|
|
private static function comparer($a, $b) { |
$cols = self::$tri_multi_dimension; |
$cols = self::$triMultiDimension; |
$i = 0; |
$resultat = 0; |
$colonne_nbre = count($cols); |
while ($resultat == 0 && $i < $colonne_nbre) { |
$mot_01 = self::enleverAccents($b[$cols[$i]]); |
$mot_02 = self::enleverAccents($a[$cols[$i]]); |
switch (self::$tri_type) { |
case 'nat' : |
$mot_01 = Chaine::supprimerAccents($b[$cols[$i]]); |
$mot_02 = Chaine::supprimerAccents($a[$cols[$i]]); |
switch (self::$triType) { |
case self::TRIE_NATUREL : |
$resultat = ($cols[$i + 1] == SORT_DESC) ? strnatcmp($mot_01, $mot_02) : strnatcmp($mot_02, $mot_01); |
break; |
case 'cs' : |
case self::TRIE_CASSE_SENSIBLE : |
$resultat = ($cols[$i + 1] == SORT_DESC) ? strcmp($mot_01, $mot_02) : strcmp($mot_02, $mot_01); |
break; |
case 'ci' : |
case self::TRIE_CASSE_INSENSIBLE : |
$resultat = ($cols[$i + 1] == SORT_DESC) ? strcasecmp($mot_01, $mot_02) : strcasecmp($mot_02, $mot_01); |
break; |
default: |