8797 sujets

Développement web côté serveur, CMS

Bonjour,

Je suis confronté à un problème plus épineux que je ne l'imaginais:
J'ai un tableau (php) contenant des noms de langue, dans la langue en question.
Exemple:
http://minimaul.net/images/php/pic1.jpg

Je voudrais trier ce tableau par ordre alphabétique, or les caractères étrangers (Bulgare et Grec par exemple), se mettent systématiquement à la fin du tableau.
J'ai cherché divers solutions, en commençant par un bête asort, puis avec sa version "améliorée", disponible dans l'extension Internationalization, ce qui à donné le résultat donné ci dessus.

Ce que j'aimerais obtenir est le tableau suivant:
http://minimaul.net/images/php/pic2.jpg

J'ai vu plusieurs discussions qui parlent de cela sur d'autre forum, mais à chaque fois il n'y avait qu'une seule langue dans le tableau, donc le problème était plus simple.

Si vous avez des idées ou des pistes de recherche, je suis preneur..

Merci d'avance
Modifié par Romain.E (08 Jun 2012 - 08:16)
Salut,

Peut être avec une fonction qui combine iconv en mode translate et asort.

En tout cas il me semble que les fonctions "sort" ne fonctionnent pas au delà de 2Bytes pour l'encodage du caractère...
Modérateur
Le problème est qu'il n'existe pas d'ordre alphabétique unicode. Un ordre alphabétique est régi par une langue. En fait ce que tu souhaites, c'est qu'ils soient classés par ordre alphabétique de leur traduction française. (Mettre la bulgarie là où tu le souhaites est arbitraire car le caractère Б n'est pas un b ). Pour ce faire, il faut avoir une table contenant

code Iso <=> Nom dans la langue <=> Nom français
BG <=> &#1041;&#1098;&#1083;&#1075;&#1072;&#1088;&#1080;&#1103; <=> Bulgarie
etc.

et trier sur le nom français.

édit: Arg, alsacréations en iso-8859-1.
Modifié par kustolovic (07 Jun 2012 - 16:21)
Duplique le tableau -> translit des valeurs -> asort -> replication de l'ordre sur le tableau d'origine. Voilà.

<?php
function iconv_table_sort($a, $b)
{ 
  // Accents Cyriliques
  
  $cyr  = array('&#1072;','&#1073;','&#1074;','&#1075;','&#1076;','e','&#1078;','&#1079;','&#1080;','&#1081;','&#1082;','&#1083;','&#1084;','&#1085;','&#1086;','&#1087;','&#1088;','&#1089;','&#1090;','&#1091;', 
        '&#1092;','&#1093;','&#1094;','&#1095;','&#1096;','&#1097;','&#1098;','&#1100;', '&#1102;','&#1103;','&#1040;','&#1041;','&#1042;','&#1043;','&#1044;','&#1045;','&#1046;','&#1047;','&#1048;','&#1049;','&#1050;','&#1051;','&#1052;','&#1053;','&#1054;','&#1055;','&#1056;','&#1057;','&#1058;','&#1059;',
        '&#1060;','&#1061;','&#1062;','&#1063;','&#1064;','&#1065;','&#1066;','&#1068;', '&#1070;','&#1071;' );
        $lat = array( 'a','b','v','g','d','e','zh','z','i','y','k','l','m','n','o','p','r','s','t','u',
        'f' ,'h' ,'ts' ,'ch','sh' ,'sht' ,'a' ,'y' ,'yu' ,'ya','A','B','V','G','D','E','Zh',
        'Z','I','Y','K','L','M','N','O','P','R','S','T','U',
        'F' ,'H' ,'Ts' ,'Ch','Sh' ,'Sht' ,'A' ,'Y' ,'Yu' ,'Ya' );
        
  $a = str_replace($cyr, $lat, $a);
  $b = str_replace($cyr, $lat, $b);
        
  $a = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $a);
  $b = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $b);
  
  $tab = array($a,$b);
  
  sort($tab);
  
  return ($a == $tab[0]) ? -1 : 1;
}

uasort($test, 'iconv_table_sort');


Ce code résous le problème du Cyrillique mais je ne trouve pas de tableau ce correspondance en grec...

Edit: bien sûr il faut remettre les caractéres ^^ (un copier collé du tableau dans la barre de recherche de google et il va te remettre les bons caractéres)
Modifié par JJK801 (08 Jun 2012 - 09:35)
Bonjour,

Merci pour vos réponses.
Je vais effectivement faire le tri en prenant la correspondance entre lettre étrangères et alphabet latin. J’espérais ne pas avoir à le faire (on ne sais jamais, une fonction magique qui m'aurait échappé..), mais ce n'est visiblement pas le cas.