Good news everyone. Solved ;-)
This function used after natcasesort on $temp make it right for czech language. Unfortunately this is language specific.
<?php
// sada funkci pro ceske razeni
//
// moodlecscoll_sort (&$array)
// moodlecscoll_charat ($string, $index)
// moodlecscoll_strcoll ($a, $b)
/**
* Setridi pole predane jako parametr se zachovanim klicu podle ceskeho
* lexikografickeho trideni bez ohledu na velikost pismen
*
* Funkce nic nevraci, primo zmeni pole predane referenci!
*
* @param array[string] &$array pole stringu v UTF-8 k setrideni, predava se referenci a tridi "na miste"
*/
function moodlecscoll_sort (&$array) {
uasort($array, 'moodlecscoll_strcoll');
}
/**
* Vrati znak na pozici $index z retezce $string, pracuje v UTF-8
*
* @param string $string retezec v UTF-8, ze ktereho znak vybirame
* @param int $index pozice znaku, ktery chceme vratit
* @return char znak v UTF-8 na pozici $index v retezci $string
*/
function moodlecscoll_charat ($string, $index) {
return mb_substr($string, $index, 1, 'UTF-8');
}
/**
* Lexikograficky komparator pro stringy v UTF-8 podle priblizneho
* ceskeho narodniho trizeni bez ohledu na velikost pismen
*
* Zamenou promenne $abeceda jde pouzit libovolne jine trizeni, jen
* ch je zadratovane vevnitr
*
* @param string $a prvni retezec ke trizeni
* @param string $b druhy retezec ke trizeni
* @return int 1 pokud je $a vetsi, 0 pokud jsou stejne, -1 pokud je $a mensi
*/
function moodlecscoll_strcoll ($a, $b) {
// tridici sekvence, obecne muze byt jakakoli, hlavne malymi pismeny
// jednina podporovana dvojhlaska je ch kvuli primemu zadratovani vevnitr
$abeceda = array ('0','1','2','3','4','5','6','7','8','9',
'a','á','b','c','Ä','d','Ä','e','é','f','g','h','ch',
'i','Ã','j','k','l','m','n', 'ň','o','ó','p','q','r','Å™','s','Å¡','t',
'ť','u','ú','ů','v','w','x','y','z','ž');
$abeceda = array_flip($abeceda);
// trideni je case insensitive
$a = mb_strtolower($a, 'UTF-8');
$b = mb_strtolower($b, 'UTF-8');
if ($a == $b) return 0;
// v cyklu prochazime pismena (CH se bere jako jedno pismeno), pokud je
// jedno vetsi tak skoncime, jinak se jede dal
$iA = 0;
$iB = 0;
do {
if (moodlecscoll_charat($a, $iA) == 'c' and moodlecscoll_charat($a, $iA+1) == 'h') {
$charA = moodlecscoll_charat($a, $iA) . moodlecscoll_charat($a,$iA + 1);
$iA++;
} else {
$charA = moodlecscoll_charat($a, $iA);
}
if (moodlecscoll_charat($b, $iB) == 'c' and moodlecscoll_charat($b, $iB+1) == 'h') {
$charB = moodlecscoll_charat($b, $iB) . moodlecscoll_charat($b, $iB+1);
$iB++;
} else {
$charB = moodlecscoll_charat($b, $iB);
}
if ($abeceda[$charA] > $abeceda[$charB]) {
return 1;
} elseif ($abeceda[$charA] < $abeceda[$charB]) {
return -1;
}
$iA++;
$iB++;
} while ($charA != and $charB != );
return 0;
}
?>
btw. in my case I had to alter one of the last lines to while ($charA !=); (which makes this part of code disabled kind of) because it gave me some error I could'nt solve but make this work at all.
As for the comments if you need, put it into google translate and you should be fine.