2012-05-18 20 views
7

Mam tablicę, która posiada nazwy języków w języku hiszpańskim:Sortuj tablicę ze znakami specjalnymi w PHP

$lang["ko"] = "coreano"; //korean 
$lang["ar"] = "árabe"; //arabic 
$lang["es"] = "español"; //spanish 
$lang["fr"] = "francés"; //french 

muszę zamówić tablicę z zachowaniem skojarzenia kluczy, więc używam asort() z SORT_LOCALE_STRING

setlocale(LC_ALL,'es_ES.UTF-8'); //this is at the beginning (config file) 
asort($lang,SORT_LOCALE_STRING); 
print_r($lang); 

oczekiwany wynik byłby w tej kolejności:

  • Array ([ar] => árabe [ko] => coreano [es] => Español [FR] => francés)

Jednakże, to co ja dostaję:

  • Array ([ko] => coreano [es] => Español [fr] => francés [ar] => árabe)

Am I czegoś brakuje? Dziekuję za odpowiedź! (Mój serwer używa PHP w wersji 5.2.13)

+0

Dziki domysł: prawdopodobnie dlatego, że 'c' pojawia się przed' á'? –

+0

Dlatego używam SORT_LOCALE_STRING. "A" powinno nadejść po "a" i przed "c". – andufo

+0

ok, powodzenia :) –

Odpowiedz

5

Try sortując translitterated nazwami:

function compareASCII($a, $b) { 
    $at = iconv('UTF-8', 'ASCII//TRANSLIT', $a); 
    $bt = iconv('UTF-8', 'ASCII//TRANSLIT', $b); 
    return strcmp($at, $bt); 
} 

uasort($lang, 'compareASCII'); 

print_r($lang); 
+0

To zadziałało. Dzięki! – andufo

+3

Może to działać w tym konkretnym przypadku, ale nie jest to solidne ogólne rozwiązanie; co się stanie, jeśli chcesz posortować tablicę zawierającą na przykład ciągi liter cyrylicy lub greki?Transliteracja ASCII nie jest szczególnie niezawodna. –

+0

@WillVousden Masz rację. W każdym razie, jeśli chodzi o tablicę zawierającą nazwy języków, wydaje mi się, że jest OK. –

2

Zdefiniowano ustawienia narodowe nieprawidłowo setlocale().

Zmiana:

setlocale(LC_ALL,'es_ES.UTF-8'); 

Do:

setlocale(LC_ALL,'es_ES'); 

wyjściowa:

Array ([ar] => árabe [ko] => coreano [es] => español [fr] => francés) 
+0

Próbowałem również, ale zwraca tę samą odpowiedź: Array ([ko] => coreano [es] => español [fr] => francés [ar] => árabe) – andufo

+1

To ustawienie jest w 100% poprawne, jeśli plik jest zakodowany w UTF-8. W każdym przypadku sufiks ustawień narodowych i kodowanie plików powinny być zgodne. – Jon

+0

@andufo Spróbuj uruchomić go pod adresem [phpester.net] (http://phptester.net/index.php?lang=en), działa tam dobrze. W takim przypadku powinieneś zobaczyć komentarz Jona i sprawdzić, jak plik jest zakodowany. –

0

Spróbuj

setlocale(LC_COLLATE, 'nl_BE.utf8'); 
$array = array('coreano','árabe','español','francés'); 
usort($array, 'strcoll'); 
print_r($array); 
+0

Niestety, nie działa :( – andufo

0

Dokumentacja dla setlocale wymienia, że ​​

Różne systemy mają różne schematy nazewnictwa dla ustawień regionalnych.

Możliwe, że twój system nie rozpoznaje ustawień regionalnych jako es_ES. Jeśli jesteś w systemie Windows, spróbuj zamiast tego użyć numeru esp_ESP.

+0

nie działa :(mój serwer programistyczny działa na Macu z OSX. – andufo