2012-05-18 22 views
7

tengo una matriz que contiene los nombres de los idiomas en español:Ordenar una matriz con caracteres especiales en PHP

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

necesito para ordenar la matriz y mantiene la asociación de índices, así que uso asort() con el 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); 

El resultado esperado sería en este orden:

  • Array ([ar] => árabe [ko] => coreano [ES] => español [FR] => Frances)

Sin embargo, esto es lo que estoy recibiendo:

  • array ([ko] => coreano [ES] => español [fr] => Frances [ar] => árabe)

me estoy perdiendo algo? ¡Gracias por tus comentarios! (Mi servidor está utilizando la Versión PHP 5.2.13)

+0

Conjetura salvaje: posiblemente porque 'c' viene antes que' á'? –

+0

Es por eso que estoy usando SORT_LOCALE_STRING. 'á' debería venir después de 'a' y antes de 'c'. – andufo

+0

bien entonces, buena suerte :) –

Respuesta

5

Try clasificación por nombres translitterated:

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

Esto funcionó. ¡Gracias! – andufo

+3

Esto puede funcionar para este caso específico, pero no es una solución general robusta; ¿Qué ocurre si quieres ordenar una matriz que contenga, por ejemplo, cadenas de caracteres cirílicos o griegos?La transliteración ASCII no es particularmente confiable. –

+0

@WillVousden Tienes razón. De todos modos, para una matriz que contiene nombres de idiomas está bien, creo. –

2

que ha definido la configuración regional de forma incorrecta en setlocale().

Cambio:

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

Para:

setlocale(LC_ALL,'es_ES'); 

Salida:

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

Lo intenté también, pero devuelve la misma respuesta: Array ([ko] => coreano [es] => español [fr] => francés [ar] => árabe) – andufo

+1

Esa configuración regional es 100% correcta si el archivo está codificado en UTF-8. En cualquier caso, el sufijo de la configuración regional y la codificación del archivo deben coincidir. – Jon

+0

@andufo Prueba ejecutarlo en [phptester.net] (http://phptester.net/index.php?lang=en) funciona bien para mí allí. Si ese es el caso, debería ver el comentario de Jon y verificar cómo está codificado su archivo. –

0

probar este

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

lo siento, no funcionó :( – andufo

0

La documentación para setlocale menciona que

Los diferentes sistemas tienen diferentes esquemas de nombres para configuraciones regionales.

Es posible que su sistema no reconozca la configuración regional como es_ES. Si está en Windows, intente con esp_ESP.

+0

no funcionó :(mi servidor de desarrollo se ejecuta en una Mac con OSX. – andufo

Cuestiones relacionadas