PHP排序数组,捷克编码,不区分大小写,无需重新索引

PHP排序数组,捷克编码,不区分大小写,无需重新索引,php,arrays,sorting,Php,Arrays,Sorting,我有一个多维问题:)我有一个数组,其中包含: 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) 2

我有一个多维问题:)我有一个数组,其中包含:

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 ě+ščřžýáíé0123465789 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)
首先,我必须保留索引,因为它们在select查询中作为ID。其次,我必须对其进行不区分大小写的排序,第三,我需要使用捷克编码对其进行排序。我寻求了一些帮助,但没有任何效果。 我将包括我当前的代码,它使用
uasort
strcoll
,但它区分大小写进行排序,甚至不适用于捷克语编码

setlocale(LC_COLLATE, 'cs_CZ.utf8');
uasort($options, 'strcoll');
我也试过这个,但结果是一样的

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

写一个排序函数,然后先放低

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 )

写一个排序函数,然后先放低

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 )

所以我最终以我想要避免的方式解决了它

$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);

所以我最终以我想要避免的方式解决了它

$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);

这是不区分大小写的,但不幸的是
čtest
仍然是数组中的最后一项,尽管它应该是第一项..编辑后:但当您添加没有捷克编码的内容时,例如
aa
bb
zz
yy
,带有特殊字符的项目仍然位于最后位置..mmh,那是有线的。必须进一步研究它的解决方案,看看我的答案,我在一些捷克论坛上搜索过,这似乎是唯一的解决方案不幸的是..它不区分大小写,但不幸的是
čtest
仍然是数组中的最后一项,尽管它应该是第一项..编辑后:但是当您添加没有捷克编码的内容时,例如
aa
bb
zz
yy
,带有特殊字符的项目仍然位于最后的位置..mmh,这是有线的。我必须更多地研究它的解决方案,看看我的答案,我已经在一些捷克论坛上搜索过了,不幸的是,这似乎是唯一的解决方案。。