2017-04-25 8 views
1

그래서이 배열은 알파벳순으로 정렬하고 악센트를 무시해야합니다 ("e"는 "é"바로 앞에 있어야하고 "a"는 " à "등). 배열은 JSON 파일에서 읽혀지고, 디코딩되고, 구성되어야하며, 다시 인코딩되어야합니다 (직원이 객체를 추가 할 수 있도록). 내 유일한 문제는 악센트가있는 모든 문자가 끝에 배치됩니다.Strcoll UTF-8 정렬 - PHP

$myArray = [ 
    {"myKey":"Aaa","values":[1,1,1,1,1,1,1]}, 
    {"myKey":"Test01","values":[1,1,1,1,1,1,1]}, 
    {"myKey":"Test02","values":[1,1,1,1,1,1,1]}, 
    {"myKey":"BBB","values":[1,1,1,1,1,1,1]}, 
    {"myKey":"Écha","values":[1,1,1,1,1,1,1]} 
] 

setlocale(LC_COLLATE, 'fr_CA.utf8'); 

usort($myArray, function($a, $b){ 
    return strcoll($a["myKey"], $b["myKey"]); 
}); 

$myNewFile = json_encode($myArray,JSON_NUMERIC_CHECK|JSON_UNESCAPED_UNICODE); 
echo $myNewFile; 

에코가 제공 : 여기 내 코드의 예입니다

[ 
    {"myKey":"Aaa","values":[1,1,1,1,1,1,1]}, 
    {"myKey":"BBB","values":[1,1,1,1,1,1,1]}, 
    {"myKey":"Test01","values":[1,1,1,1,1,1,1]}, 
    {"myKey":"Test02","values":[1,1,1,1,1,1,1]}, 
    {"myKey":"Écha","values":[1,1,1,1,1,1,1]} 
] 

가해야 할 때 : 난 내 최선 노력으로 나는 또한 다음을 시도했습니다

[ 
    {"myKey":"Aaa","values":[1,1,1,1,1,1,1]}, 
    {"myKey":"BBB","values":[1,1,1,1,1,1,1]}, 
    {"myKey":"Écha","values":[1,1,1,1,1,1,1]}, 
    {"myKey":"Test01","values":[1,1,1,1,1,1,1]}, 
    {"myKey":"Test02","values":[1,1,1,1,1,1,1]} 
] 

이 주제에 대한 여러 게시물로 기존 솔루션을 찾으십시오.

$collator = new Collator('fr_CA.utf8'); 
$collator->sort($myArray); 
(내가 PHP 7+에있어,하지만 난 필사적이야 이후 필요 없음)

usort($myArray, function($a, $b) { 
    return $a['myKey'] <=> $b['myKey']; 
}); 

나는 또한했습니다 (I는 PHP에있어 이후 7+)

usort($myArray["Ingrédients"], 'custom_sort'); 

function custom_sort(($a, $b){ 
    return strcoll($a["Ingrédients"], $b["Ingrédients"]); 
}); 

및 5,

및 같은

'fr_CA.utf8', 'fr_FR.utf8', 'fr_CA', 'fr_FR' 

각각의 방법 중 하나로 내 setlocale에 대한 사용되는 다른 국가 코드는, 내가 지금까지 본 적이 모든 게시물에있는 모든 사람을 위해 일 것 같다,하지만 그들은 매우 일자 있습니다. 그것들은 악센트를 분류하는 것 외에는 모두 작동합니다. 그래서 나는 방법과 상관없이 제가 얻고있는 것과 같은 결과를 얻습니다. 서버가 PHP 7.1.1을 사용하고 있다면 도움이됩니다. 저는 정말 어려움을 겪었습니다. 누군가가 이것에 대한 수정을 알고 있거나 테이블에 가져올 계발이 있다면 정말 좋을 것입니다.

감사합니다.

편집/해결책 :

그것은 여전히에 usort하지만 악센트 문자에 대한 추가 교체와 함께. 여기에는 프랑스어에 대한 문자 만 포함되어 있지만 아이디어를 얻을 수 있습니다.

usort($myArray, function($a, $b) { 
    $translit = array('Á'=>'A','À'=>'A','Â'=>'A','Ä'=>'A','Ã'=>'A','Å'=>'A','Ç'=>'C','É'=>'E','È'=>'E','Ê'=>'E','Ë'=>'E','Í'=>'I','Ï'=>'I','Î'=>'I','Ì'=>'I','Ñ'=>'N','Ó'=>'O','Ò'=>'O','Ô'=>'O','Ö'=>'O','Õ'=>'O','Ú'=>'U','Ù'=>'U','Û'=>'U','Ü'=>'U','Ý'=>'Y','á'=>'a','à'=>'a','â'=>'a','ä'=>'a','ã'=>'a','å'=>'a','ç'=>'c','é'=>'e','è'=>'e','ê'=>'e','ë'=>'e','í'=>'i','ì'=>'i','î'=>'i','ï'=>'i','ñ'=>'n','ó'=>'o','ò'=>'o','ô'=>'o','ö'=>'o','õ'=>'o','ú'=>'u','ù'=>'u','û'=>'u','ü'=>'u','ý'=>'y','ÿ'=>'y'); 
    $at = strtr($a['myKey'], $translit); 
    $bt = strtr($b['myKey'], $translit); 
    return strcoll($at, $bt); 
}); 

앞으로 도움이되기를 바랍니다.

답변

1

자, 문제는 캐릭터의 가치 때문입니다. strcoll은 사용중인 문자 세트의 문자 값을 기준으로 문자열을 비교합니다. 나는 당신이 utf-8이나 비슷한 것을 사용하고 있다고 가정 할 것입니다. 값은 UTF-8을 참조하십시오. 악센트 부호가있는 e의 값이 Z보다 훨씬 더 큽니다. 이것이 바로 당신이이 문제를 겪고있는 이유입니다. 이 문제를 해결하려면 악센트 부호가있는 문자에 특별한 경우를 추가해야합니다. 그렇지 않으면 정상적으로 정렬되지 않습니다. 그래서, 기본적으로, f가 대개 어디에 있을지와 같은 악센트 부호로 e를 두는 비교 함수를 만듭니다.

+0

실제로 실제로 많은 의미가 있습니다. 감사합니다. 내가 바로 잡을거야! –

+0

아니요, 문제가 있습니다. 또한 여기에서 새로운 것 같으니 https://stackoverflow.com/help/someone-answers –

+0

을 참조하십시오. 관심있는 모든 사람들을 위해 그리고 미래의 참고 자료로 OP를 업데이트 할 것입니다. 필자의 교체 기능이 실제로 값 대신 텍스트를 대체 한 후 2012 년에 작성된 프랑스 포럼에 대한 많은 연구를 통해 해결책을 찾았습니다. –