2012-05-18 9 views
7

Tôi có một mảng chứa tên các ngôn ngữ ở Tây Ban Nha:Sắp xếp một mảng với các nhân vật đặc biệt trong PHP

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

tôi cần phải ra lệnh cho các mảng và duy trì mối liên index, vì vậy tôi sử dụng asort() với 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); 

sản lượng dự kiến ​​sẽ theo thứ tự này:

  • Array ([ar] => Arabe [ko] => coreano [es] => español [fr] => Francés)

Tuy nhiên, đây là những gì tôi đang nhận:

  • Mảng ([ko] => coreano [es] => español [fr] => francés [ar] => árabe)

Tôi có thiếu gì đó không? Cảm ơn phản hồi của bạn! (Máy chủ của tôi đang sử dụng PHP Version 5.2.13)

+0

Đoán ngẫu nhiên: có thể vì 'c' đến trước 'á'? –

+0

Đó là lý do tôi đang sử dụng SORT_LOCALE_STRING. 'á' nên đến sau 'a' và trước 'c'. – andufo

+0

ok, chúc may mắn :) –

Trả lời

5

Cố gắng sắp xếp theo tên 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

Điều này đã hiệu quả. Cảm ơn! – andufo

+3

Điều này có thể làm việc cho trường hợp cụ thể này, nhưng nó không phải là một giải pháp chung mạnh mẽ; điều gì sẽ xảy ra nếu bạn muốn sắp xếp một mảng chứa, ví dụ, các chuỗi ký tự Cyrillic hoặc Hy Lạp?Chuyển chữ ASCII không đáng tin cậy lắm. –

+0

@WillVousden Bạn nói đúng. Dù sao, đối với một mảng có chứa tên của ngôn ngữ thì tôi nghĩ vậy. –

2

Bạn định nghĩa locale của bạn không đúng trong setlocale().

Thay đổi:

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

Để:

setlocale(LC_ALL,'es_ES'); 

Output:

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

Tôi cũng đã thử điều đó, nhưng nó trả về cùng một phản hồi: Array ([ko] => coreano [es] => español [fr] => francés [ar] => árabe) – andufo

+1

Ngôn ngữ đó chính xác 100% nếu tệp được mã hóa bằng UTF-8. Trong mọi trường hợp, hậu tố miền địa phương và mã hóa tệp phải khớp nhau. – Jon

+0

@andufo Hãy thử chạy nó tại [phptester.net] (http://phptester.net/index.php?lang=vi) nó hoạt động tốt cho tôi ở đó. Nếu đó là trường hợp bạn sẽ thấy bình luận của Jon và kiểm tra xem tập tin của bạn được mã hóa như thế nào. –

0

Hãy thử điều này

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

xin lỗi, không hoạt động: ( – andufo

0

Tài liệu cho số setlocale đề cập rằng

Hệ thống khác nhau có các lược đồ đặt tên khác nhau cho ngôn ngữ.

Có thể hệ thống của bạn không nhận ra ngôn ngữ là es_ES. Nếu bạn sử dụng Windows, hãy thử thay vào đó, hãy thử esp_ESP.

+0

không hoạt động: (máy chủ phát triển của tôi chạy trên máy Mac có OSX. – andufo