Tri alphabétique des caractères accentués en PHP

Tous ceux qui manipulent le PHP le savent, il ne gère pas l’encodage UTF8, et rien n’est prévu pour gérer les caractères accentués dans les critères de tri.

Or on n’aime pas bien voir s’afficher l’Égypte après le Zimbabwe dans une liste de pays, ça ne nous semble pas du tout naturel…

Il y a une solution radicale : on vire les accents, comme ça on est tranquille, c’est d’ailleurs ce que l’on lit partout sur le Web. Mais c ‘est introduire des fautes d’orthographe dans le contenu et ça n’est pas du tout satisfaisant.

Alors comment faire ?

Voici ma solution, simple et élégante (enfin c’est mon opinion 🙂 : au lieu de désaccentuer le libellé de la colonne de tableau sur laquelle on fera le tri, je la laisse intacte mais j’ajoute une nouvelle entrée désaccentuée qui sera utilisée pour le tri, mais pas pour l’affichage. C’est tout simple mais je ne l’ai lu nulle part, ce qui ne veut pas dire que personne n’y a pensé avant moi, mais que ce n’est pas assez visible sur la toile, alors un article de plus à ce sujet ne peut pas faire de mal.

En ce qui concerne la façon de procéder,il faut utiliser ce qu’on appelle une boucle (pour les non-initiés, c’est une fonction qui répète sans cesse la ou les mêmes instructions jusqu’à ce qu’elle rencontre un élément qui lui permette de comprendre que c’est terminé). Donc, que l’on utilise une boucle for avec un count($montableau) ou une boucle foreach, il suffit d’écrire un truc du genre :

qui utilise une fonction nommée nettoyage dont le boulot est de supprimer les caractères accentués (et même plus si on veut, comme on le verra ci-dessous), et le tour est joué !

Maintenant j’aurai cet affichage :

  • Dominique
  • Égypte
  • Émirats Arabes Unis
  • Équateur
  • Érythrée
  • Espagne
  • Estonie
  • États-Unis
  • Éthiopie
  • Fidji

et non pas :

  • Dominique
  • Egypte
  • Emirats Arabes Unis
  • Equateur
  • Erythree
  • Espagne
  • Estonie
  • Etats-Unis
  • Ethiopie
  • Fidji

ce qui est quand même mieux.

Mais j’ai en outre quelque chose à dire sur cette fameuse fonction de nettoyage…

La fonction de nettoyage

Il m’a fallu écumer plusieurs forums pour trouver les bonnes pistes, et encore j’ai dû mixer plusieurs versions pour avoir quelque chose qui transforme correctement de l’encodage UTF8 en ASCII sans caractères spéciaux, quelque chose qui puisse être passé en paramètre dans une URL par exemple, ce qui explique le nom que je lui ai donné.

Contrairement à plusieurs autres versions trouvées ici ou là cette fonction fait bien son boulot, je ne lui en demande pas plus, mais pas moins…

En détail :

  • la première ligne converti la chaîne de caractères UTF8 en minuscules, parce que espagne classé avant Afrique c’est nul, et pourtant les minuscules sont avant les majuscules dans l’ordre de tri, donc on met tout le monde au même niveau (on pourrait aussi tout convertir en majuscules, aucune importance, le résultat sera le même) ;
  • la seconde définit le tableau (la liste) des caractères à remplacer, la suivante le tableau des remplacements à appliquer, et la quatrième effectue le remplacement ;
  • les deux lignes suivantes permettent de remplacer aussi divers caractères spéciaux par un tiret (-), c’est aussi quelque chose dont on a souvent besoin.

Si on ne veut pas remplacer les caractères spéciaux, il suffit de commenter ou supprimer les deux lignes correspondantes, ou les adapter.

Ce que je tenais à dire par rapport à cette fonction ne saute pas aux yeux immédiatement, mais si on cherche bien on verra que j’ai ajouté deux caractères que l’on ne trouve pas habituellement dans ce type de fonction de remplacement : les ligatures linguistiques æ et œ. En effet, ces ligatures sont obligatoires, on doit écrire Lætitia et bœuf et non pas Laetitia et boeuf, la preuve en est que les dictionnaires orthographiques des traitements de texte les indiquent comme des erreurs. Or apparemment personne ne pense à intégrer ces caractères dans les listes de remplacement, pas même les programmeurs francophones… Ma fonction le fait.

Le tri par colonne

Si vous lisez ces lignes c’est que vous cherchez à trier un tableau par colonne, alors même si on la trouve partout sur le Web, voici la fonction qui fait le boulot et qui le fait bien :

Et voilà, elle est pas belle, la vie ?

Bookmarquez le permalien.

Les commentaires sont clos.