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($artrue) . '</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… Jetons plutôt un œil neuf sur le précédent billet expliquant comment supprimer les accents 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 donne cette fois :

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.

Laisser un commentaire

5 commentaires

Spone
Spone

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 =)

clem
clem

Y'a aussi la classe Collator qui permet de faire ce genre de choses ;) http://fr.php.net/manual/fr/class.collator.php

Clem
Clem

Oui je fais assez mon évangéliste sur PDO, SPL et Intl Je crois que y'a que OVH qui propose PHP 5.3 actuellement, mais y'a pas Intl :-( Pour Debian PHp 5.3 est de la partie dans la prochaine version (1 ~ 3 mois) ainsi que Intl ;-) Ps : Aujourd'hui est sortie PHP 5.3.4

Olivier
Olivier

Salut Clem,

Très au courant des API d'internationalisation à ce que je vois :-) Malheureusement PHP5.3 n'est qu'un doux rêve pour moi parce qu'il n'est pas disponible sur le serveur qui héberge nos clients, la faute à Debian apparemment. C'est triste mais c'est comme ça. Alors en attendant noël le jour merveilleux qui apportera plein de nouvelles API et des espaces de nom, je range ton lien dans mes favoris et je te remercie.

jc
jc

Bonjour les bibinautes Merci Tu me sauves la vie :-) Je galère depuis 1 heure sur google aucun snippet ne fonctionne sauf le tient utf8->iso iso-<utf8 ++