8722 sujets

Développement web côté serveur, CMS

Modérateur
Bonjour,

Il me faut trier une liste de pays par ordre alphabétique. J'utilise pour cela simplement la fonction sort(). Mais cela pose problème lorsque le pays commence par un accent (comme pour Éthiopie) qui se retrouve à la fin de la liste et non au niveau des pays commençant par un "E".
Il faut savoir que je travaille en utf-8, quoi de plus normal donc d'obtenir ce résultat !
Je me suis mis à la recherche d'une solution sur le Web. Deux méthodes proposées :
* Utiliser l'extension intl qui est bien activée sur mon serveur. Le problème est que je ne peux pas ajouter le fr_FR puisque je n'ai pas la possibilité d'intervenir sur le serveur (chez OVH).
* Utiliser setLocale, mais ça ne fonctionne pas non plus.
L'article qui parle de ces deux solutions : http://phpolyk.wordpress.com/2011/08/27/sorting-array-with-special-character-accent/
Il y a d'autres ressources sur le Web à ce sujet, mais je ne suis pas sûr qu'elles soient adaptées à mon cas. J'ai essayé la méthode proposée sur le billet suivant : http://www.weirdog.com/blog/php/trier-les-cles-accentuees-dun-tableau-associatif.html (autre billet lié : http://www.weirdog.com/blog/php/supprimer-les-accents-des-caracteres-accentues.html), ne fonctionne pas non plus.
Quelqu'un aurait-il une idée dans quelle direction il faudrait que je m'oriente ? Version php : 5.3
Merci d'avance.

Edit : collator ne fonctionne pas non plus...
Modifié par jojaba (10 Aug 2014 - 14:24)
Pourquoi ne pas stocker dans un dictionnaire les éléments commençant pas un accent. Puis les remplacer par des non accent et les classés ?
Tu veux dire quoi par Collator ne fonctionne pas ? IL n'est pas disponible sur ton serveur, ou bien tu n'obtiens pas le résultat escompté ?
parce qu'évidemment c'est la meilleure solution à ton problème.

Sans collator, je t'aurais bien proposé d'utiliser usort avec un callback correspondant à un équivalent mbstring de strcmp, mais je viens de m'apercevoir qu'il n'y en avait pas. Ca peut être une piste valide mais il va falloir alors créer toi-même ton comparateur... pas franchement facile et c'est plutôt du bricolage.

LE plus simple serait alors sans doute d'utiliser usort mais, en guise de callback, returner strcmp(desaccentuer($chaine1), desaccentuer($chaine2)) avec desaccentuer une fonction qui, comme son nom l'indique, désaccentue les caractères accentués. En français c'est une approche qui marchera puisqu'on ignore normalement les accents lors d'un tri. Pour les langues où on n'ignore pas les accents, il faudra ruser un peu plus intelligemment pour avoir un tri correct, avec des astuces du genre remplacer "ä" par "a\x7F" pour que tous les "ä" viennent après les "a". En gros c'est refaire le job du collator soi-même, en plus buggé et en moins bien, donc ce serait bien mieux de voir pourquoi le collator ne marche pas chez toi d'abord.

Pour désaccentuer, le bon vieux strtr ne fonctionne plus en UTF-8. Pas le choix, il n'y a guère plus qu'un bon gros str_replace pour le faire, en prenant bien soin que le code source soit lui-même encodé en UTF-8 aussi (sinon ça ne marchera pas)
Modérateur
Ah ben merci pour vos réponses !
J eme suis finalement simplifié la vie en faisant le tri avant, dans la requête sql. C'est beaucoup plus simple et pas de problème avec les accents. Smiley cligne
Ceci dit, j'aurais bien voulu savoir pour collator ne fonctionne pas (page a moitié affichée), qu'en j'aurai plus de temps... Mais apparemment, ça le faisait qu'en local pas sur l'hébergement OVH...
Modifié par jojaba (11 Aug 2014 - 12:44)