2017-04-24 45 views
0

我在多層面的問題:)我有一個數組,其中包含此:PHP數組排序與捷克的編碼,不區分大小寫,而無需重新索引

array (33) 
18 => "D3 0309/II Ševětín – Borek" (31) 
19 => "D3 0311 TŘEBONÍN – KAPLICE NÁDRAŽÍ" (41) 
25 => "D3 0312/I Kaplice nádraží - Nažidla" (39) 
26 => "D3 0312/II - Nažidla - Dolní Dvořiště státní hranice" (59) 
27 => "D3 TEST" (7) 
15 => "D30310_Hodějovice-Třebonín" (29) 
30 => "D4 Lety - Čimelice" (19) 
29 => "D4 Milín - Lety" (16) 
32 => "D4 Mirotice rozšíření" (25) 
20 => "D4 křižovatka II/118 – Milín, DSP" (38) 
31 => "D4 Čimelice - Mirotice" (23) 
13 => "D6 Lubenec obchvat 1.etapa" (26) 
23 => "D6 Nové Strašecí-Řevničov" (30) 
6 => "D6 Řevničov obchvat" (21) 
33 => "D8 MÚK Zdiby – rozšíření Prosecké radiály, etapa 2 – direktní větev" (80) 
12 => "I/21 Trstěnice - Drmoul" (24) 
2 => "I/37 Chrudim - obchvat, úsek křiž. I/17 - Slatiňany" (55) 
44 => "Jirka (ostatni nesahat) - import Valbek" (39) 
17 => "Klatovy" (7) 
37 => "Letiste Pribram" (15) 
24 => "Optimalizace traťového úseku Mstětice – Praha - Vysočany" (63) 
34 => "Radost II" (9) 
7 => "SOKP 512 "D1-Jesenice - Vestec" Psáry - přeložka silnice II/105" (66) 
14 => "Stavba - návod" (15) 
43 => "Test ě+ščřžýáíésss" (38) 
4 => "Testovací stavba" (17) 
39 => "Videnska" (8) 
38 => "Vratislavice" (12) 
36 => "Zvýšení kapacity trati Nymburk – Mladá Boleslav, 2.stavba" (63) 
41 => "jirka test 4" (12) 
22 => "test" (4) 
35 => "test-D4 křižovatka II/118 – Milín" (38) 
45 => "čtest" (6) 

起初,我必須保持指標,因爲它們在選擇查詢中作爲ID使用。其次,我必須排除不區分大小寫的情況,第三,我需要使用捷克語編碼進行排序。我尋找一些幫助,但沒有爲我工作。 我包括我當前的代碼,它使用uasortstrcoll,但排序區分大小寫的,甚至不捷克編碼工作...

setlocale(LC_COLLATE, 'cs_CZ.utf8'); 
uasort($options, 'strcoll'); 

也試過,但同樣的結果...

setlocale(LC_COLLATE, 'cs_CZ.utf8'); 
asort($options, SORT_LOCALE_STRING); 

回答

0

寫一個排序函數,先寫下來。

setlocale(LC_COLLATE, 'cs_CZ.utf8'); 
function sortme ($a,$b){ 
    $a = mb_strtolower($a); 
    $b = mb_strtolower($b); 
    return strcoll($a,$b); 
} 

$options = array('Ša','šb','Šc','šd'); 
uasort($options, 'sortme'); 
print_r($options); 

//result with strtolower 
//Array ([0] => Ša [1] => šb [2] => Šc [3] => šd) 

//result without mb_strtolower 
//Array ([0] => Ša [2] => Šc [1] => šb [3] => šd) 
+0

這可以作爲不區分大小寫的,但不幸的是'čtest'仍然在數組最後一個項目,儘管它應該是第一個.. – HS1993

+0

編輯後:但是當你添加了一些不捷克encoing,例如像'AA ','bb','zz','yy',帶有特殊字符的項目仍然處於最後位置.. – HS1993

+0

mmh,即有線。不得不看更多的 – JustOnUnderMillions

0

所以我終於用我想避免的方式解決它。

$sort = function ($a, $b){ 
    static $czechCharsS = array('Á', 'Č', 'Ď', 'É', 'Ě' , 'Ch' , 'Í', 'Ň', 'Ó', 'Ř', 'Š', 'Ť', 'Ú', 'Ů' , 'Ý', 'Ž', 'á', 'č', 'ď', 'é', 'ě' , 'ch' , 'í', 'ň', 'ó', 'ř', 'š', 'ť', 'ú', 'ů' , 'ý', 'ž'); 
    static $czechCharsR = array('AZ','CZ','DZ','EZ','EZZ','HZZZ','IZ','NZ','OZ','RZ','SZ','TZ','UZ','UZZ','YZ','ZZ','az','cz','dz','ez','ezz','hzzz','iz','nz','oz','rz','sz','tz','uz','uzz','yz','zz'); 

    $A = str_replace($czechCharsS, $czechCharsR, $a); 
    $B = str_replace($czechCharsS, $czechCharsR, $b); 

    return strnatcasecmp($A, $B); 
}; 
uasort($options, $sort);