2010-07-08 3 views
2

usort과 조합하여 strcmp을 조합하여 국가 이름 배열을 정렬합니다. 현재 정렬 순서는 다음과 같습니다 떨어져 Österreich의 위치에서, 올바른로캘 인식 문자열 비교

Belgien 
Frankreich 
Italien 
Luxemburg 
Niederlande 
Spanien 
United Kingdom 
Österreich 

. NiederlandeSpanien 사이 여야합니다.

또한 strnatcmpstrcoll (setlocale)을 사용했지만 정렬 순서는 내가 원하는 방식이 아니 었습니다. 결과는 mysql 데이터베이스에서 가져온 것이 아니므로, mysql 쿼리를 통한 정렬은 옵션이 아닙니다.

답변

5

이전 질문. 한편 나는 다른 프로젝트에서 다른 회사에서 일하고 있지만 최근에는 같은 문제에 직면했다. 마지막으로 PHP 용 intl extension을 설치했습니다.

sudo apt-get install php5-intl 

그리고 사용 :

$arr = array(
"Belgien", 
"Frankreich", 
"Italien", 
"Luxemburg", 
"Niederlande", 
"United Kingdom", 
"Österreich", 
"Spanien", 
"Ásdf", 
); 

$coll = collator_create('de_DE'); 
$coll->sort($arr); 
print_r($arr); 

이 예상 순서로 결과를 반환 :

Array 
(
    [0] => Ásdf 
    [1] => Belgien 
    [2] => Frankreich 
    [3] => Italien 
    [4] => Luxemburg 
    [5] => Niederlande 
    [6] => Österreich 
    [7] => Spanien 
    [8] => United Kingdom 
) 
0

이 작동 (스크립트를 가정은 UTF-8 인) :

<?php 

$arr = array(
"Belgien", 
"Frankreich", 
"Italien", 
"Luxemburg", 
"Niederlande", 
"United Kingdom", 
"Österreich", 
"Spanien", 
"Ásdf", 
); 

setlocale(LC_COLLATE, "pt_PT.UTF8"); 
usort($arr, 'strcoll'); 
print_r($arr); 

저를 제공합니다

 
Array 
(
    [0] => Ásdf 
    [1] => Belgien 
    [2] => Frankreich 
    [3] => Italien 
    [4] => Luxemburg 
    [5] => Niederlande 
    [6] => Österreich 
    [7] => Spanien 
    [8] => United Kingdom 
) 

그러나,이 고통스러운; 로케일을 설치해야합니다. locale -a은 설치된 로케일을 제공합니다 (예 : 내 컴퓨터에서 그것은 나를 준다 :

 
C 
en_US 
en_US.iso88591 
en_US.utf8 
POSIX 
pt_PT.utf8 
+0

난 당신의 코드와 setlocale에 (LC_COLLATE, "de_DE.UTF8")를 시도를 ;,하지만, 로케일을 사용할 수 있는지 확인했지만 정확한 순서로 배열을 정렬하지 않습니다. – Max

+0

@ Max 아마도 스크립트가 UTF-8이 아닙니다. de_DE.iso88591 시도 – Artefacto