Тема: Сортування масиву з укр мовою. php.
Вітаю.
Плавав по гуглу і натрапив на одну з тем цього форуму.
http://replace.org.ua/topic/3410/
І хоча там є, вроді як, робочий приклад, але в мене все одно не працює.
Є асоціативний масив. "текст" => "номери сторінок".
Сортую по тексту.
echo "<pre>";
setlocale(LC_ALL, 'uk_UA');
ksort($positions, SORT_LOCALE_STRING);
var_dump($positions);
exit;
запросив список укр локалів хостера:
uk_UA
uk_UA.koi8u
uk_UA.utf8
деякі сортують норм все, крім "і", "є". інші взагалі фігню видають.
ну, думаю, фіг з ним. пишу так:
uksort($positions, function ($a, $b) {
$alphabet = array (
' ' => 0, '!' => 1, '@' => 2, '#' => 3, '$' => 4, '%' => 5, '^' => 6, '&' => 7, '*' => 8, '(' => 9,
')' => 10, '-' => 11, '_' => 12, '=' => 13, '+' => 14, '№' => 15, '[' => 16, ']' => 17, '{' => 18, '}' => 19,
';' => 20, ':' => 21, '\'' => 22, '"' => 23, ',' => 24, '.' => 25, '<' => 26, '>' => 27, '?' => 28, '/' => 29,
'\\' => 30, '|' => 31, '`' => 32, '~' => 33, '–' => 34,
'0' => 40, '1' => 41, '2' => 42, '3' => 43, '4' => 44, '5' => 45, '6' => 46, '7' => 47, '8' => 48, '9' => 49,
'А' => 50, 'Б' => 51, 'В' => 52, 'Г' => 53, 'Ґ' => 54, 'Д' => 55, 'Е' => 56, 'Є' => 57, 'Ж' => 58, 'З' => 59,
'И' => 60, 'І' => 61, 'Ї' => 62, 'Й' => 63, 'К' => 64, 'Л' => 65, 'М' => 66, 'Н' => 67, 'О' => 68, 'П' => 69,
'Р' => 70, 'С' => 71, 'Т' => 72, 'У' => 73, 'Ф' => 74, 'Х' => 75, 'Ц' => 76, 'Ч' => 77, 'Ш' => 78, 'Щ' => 79,
'Ь' => 80, 'Ю' => 81, 'Я' => 82,
'а' => 90, 'б' => 91, 'в' => 92, 'г' => 93, 'ґ' => 94, 'д' => 95, 'е' => 96, 'є' => 97, 'ж' => 98, 'з' => 99,
'и' => 100, 'і' => 101, 'ї' => 102, 'й' => 103, 'к' => 104, 'л' => 105, 'м' => 106, 'н' => 107, 'о' => 108, 'п' => 109,
'р' => 110, 'с' => 111, 'т' => 112, 'у' => 113, 'ф' => 114, 'х' => 115, 'ц' => 116, 'ч' => 117, 'ш' => 118, 'щ' => 119,
'ь' => 120, 'ю' => 121, 'я' => 122, 'ы' => 123,
'A' => 130, 'B' => 131, 'C' => 132, 'D' => 133, 'E' => 134, 'F' => 135, 'G' => 136, 'H' => 137, 'I' => 138, 'J' => 139,
'K' => 140, 'L' => 141, 'M' => 142, 'N' => 143, 'O' => 144, 'P' => 145, 'Q' => 146, 'R' => 147, 'S' => 148, 'T' => 149,
'U' => 150, 'V' => 151, 'W' => 152, 'X' => 153, 'Y' => 154, 'Z' => 155,
'a' => 160, 'b' => 161, 'c' => 162, 'd' => 163, 'e' => 164, 'f' => 165, 'g' => 166, 'h' => 167, 'i' => 168, 'j' => 169,
'k' => 170, 'l' => 171, 'm' => 172, 'n' => 173, 'o' => 174, 'p' => 175, 'q' => 176, 'r' => 177, 's' => 178, 't' => 179,
'u' => 180, 'v' => 181, 'w' => 182, 'x' => 183, 'y' => 184, 'z' => 185
);
$len_a = mb_strlen($a, 'Windows-1251');
$len_b = mb_strlen($b, 'Windows-1251');
if ($len_a < $len_b) {
$len = $len_a;
$short = 1;
} else {
$len = $len_b;
$short = 2;
}
$toggle = 0;
for ($i = 0; $i < $len; $i++){
if ($alphabet[$a[$i]] < $alphabet[$b[$i]]) {
$toggle = 1;
} elseif ($alphabet[$a[$i]] > $alphabet[$b[$i]]) {
$toggle = 2;
}
}
if ($toggle == 1) { // якщо перший вище по алфавіту
return 1;
} elseif ($toggle == 2) {
return -1;
} elseif ($short == 1) { // якщо однакові, але перший коротший
return 1;
} else {
return -1;
}
});
var_dump($positions);
exit;
і все одно не сортує.
Що я роблю не так? Чи можна якось по іншому це запрожити?