Trier les clés accentuées d'un tableau associatif
Pour éviter la perte des étiquettes ayant la même popularité on range celles-ci dans un tableau associatif en utilisant l'étiquette comme clé et sa popularité comme valeur. Afin de les afficher d'une façon agréable on trie nos étiquettes alphabétiquement, en utilisant la fonction ksort() :
<?php
$ar = array
(
'popé' => 4,
'épinard' => 1,
'carotte' => 5,
'Marrons' => 6,
'epsilon' => 1,
'zéro' => 2,
'popo' => 4,
'Étourderie' => 2
);
ksort($ar);
echo '<pre>' . print_r($ar, true) . '</pre>';
?>
Ce qui nous donne :
Array
(
[Marrons] => 6
[carotte] => 5
[epsilon] => 1
[popo] => 8
[popé] => 4
[zéro] => 7
[Étourderie] => 2
[épinard] => 1
)
Patatra ! C'est tout nul ! Les lettres accentuées sont toutes à la fin et "popé" vient après "popo". Voilà ce que c'est que de confier la responsabilité de concevoir des langages de programmation à des américains ! C'est le bordel total :-D
Qu'allons nous faire ?! Désespérer, maudire, s'en moquer… non ! Jetons plutôt un œil neuf sur le précédent billet expliquant comment supprimer l'accentuation des caractères accentués, et utilisons judicieusement la fonction uksort() :
<?php
function wd_unaccent_compare($a, $b)
{
return strcmp(wd_remove_accents($a), wd_remove_accents($b));
}
uksort($ar, 'wd_unaccent_compare');
?>
Ce qui cette fois-ci nous donne :
Array
(
[Marrons] => 6
[Étourderie] => 2
[carotte] => 5
[épinard] => 1
[epsilon] => 1
[popé] => 4
[popo] => 8
[zéro] => 7
)
C'est déjà bien mieux ! Hmm… ce serait toute de même sympa d'avoir "Marrons" et "Étourderie" au milieu de leurs petits copains. Un coup de strtolower() et on en parle plus :
<?php
function wd_unaccent_compare_ci($a, $b)
{
return strcmp(strtolower(wd_remove_accents($a)), strtolower(wd_remove_accents($b)));
}
?>
Ce qui nous donne au final :
Array
(
[carotte] => 5
[épinard] => 1
[epsilon] => 1
[Étourderie] => 2
[Marrons] => 6
[popé] => 4
[popo] => 8
[zéro] => 7
)
Cette fois-ci, c'est merveilleux. Nous somme conquis, la foule hystérique acclame.
Woah merci ça c'est que du bonheur ! J'ai pu appliquer cette fonction à la liste de noms de pays localisés fournie par Zend Framework, et les États-Unis ne se retrouvent plus derrière le Zimbabwe =)