Сортування українських символів (символи "є" та "і" ідуть перед "а").

Отже, зіткнувся з такою проблемою, що не вірно сортуються українські символи, а саме "є" та "і".

Якщо говорити про сортування під час вибірки з бази даних, то вирішення даної проблеми знайшов шляхом зміни порівняння кодування таблиці з utf8_general_ci на utf8_unicode_ci:
ALTER TABLE `node` CHANGE `title` `title` VARCHAR(255) CHARACTER SET
utf8 COLLATE utf8_unicode_ci NOT NULL;

Але якщо дані, які мені необхідно сортувати, не приходять з БД, а з іншого джерела? Доводиться сортувати через PHP. Що в цьому випадку робити? Можливо це питання не дуже по адресу... сподіваюся, що хтось стикався з цією проблемою і знає її вирішення.

Коментарів:

7

Коментувати

Увійдіть або зареєструйтесь, щоб додати коментар

Коментарі

function sort_uk( $a, $b ){
$a = mb_strtoupper ( $a, 'UTF-8' );
$b = mb_strtoupper ( $b, 'UTF-8' );
$alphabet = array(
'А' => 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
);
$lengthA = mb_strlen ( $a, 'UTF-8' );
$lengthB = mb_strlen ( $b, 'UTF-8' );
for( $i = 0; $i < ( $lengthA > $lengthB? $lengthB : $lengthA ); $i++ ){
if ( $alphabet[ mb_substr( $a, $i, 1, 'UTF-8' ) ] < $alphabet[ mb_substr( $b, $i, 1, 'UTF-8' ) ] ){
$status = -1;
break;
}
elseif ( $alphabet[ mb_substr( $a, $i, 1, 'UTF-8' ) ] > $alphabet[ mb_substr( $b, $i, 1, 'UTF-8' ) ] ){
$status = 1;
break;
}
else{
$status = 0;
}
}
return $status;
}

uasort($arr, 'sort_uk');
разве что так

хотя правильнее это установить украинскую локаль изначально
http://ua.php.net/manual/en/function.setlocale.php

дуже дякую за швидкі відповіді!

як варіант =)

Підскажіть будь ласка в який файл і рядок необхідно додати код, наведений Orb в першому коментарі, щоб сортування відбувалось правильно.

правильный второй комментарий :)
Функцию из первого комментария можно установить куда угодно, но она будет работать только в ваших модулях (в друпал она не встраивается)

Большое спасибо, получилось, наконец-то разобрался что надо делать со строкой

ALTER TABLE `node` CHANGE `title` `title` VARCHAR(255) CHARACTER SET
utf8 COLLATE utf8_unicode_ci NOT NULL;

Я просто не знал, что с этой строкой делать. А надо было зайдя в phpMyAdmin выбрать базу данных необходимого сайта, выбрать вкладку SQL (она вторая после структуры) и вставить эти строки в поле Run SQL query/queries on database, и кликнуть Go. И заголовки нод стали нормально сортироваться.
Того же результата можно добиться и другим путем если выбрать таблицу node, потом вкладку Структура. В строке title кликнуть на карандаш (change). В строке Collation выбрать utf_unicode_ci. А дальше Go.
А чтоб еще и термины таксономии сортировались правильно можно зайти в таблицу taxonomy_term_data и так же само поменять свойство поля name.