Сортировка массива по алфавиту (русский, арабский, иврит, украинский, немецкий идр)

iSlayter

Новичок
Сортировка массива по алфавиту (русский, арабский, иврит, украинский, немецкий идр)

Столкнулся с необходимостью сортировки массива букв по алфавиту на http://www.keyboard.su/

Проблема в чем - изначально данные хранятся в трех массивах - в каждом символы только для одного из рядов кнопок клавиатуры.
Появилась необходимость создания панелек с буквами в алфавитном порядке (панель под текстовой областью). Решил я делать array_merge, а затем sort(), так вот проблема в том, что в этом случае в русском языке буква "ё" попадает в конец алфавита (для воспроизведения клик по "Русский" в списке языков, буквы поменяются на JS) и подобные проблемы наблюдаются со всеми другими языками.

Можно ли как-то с этим бороться? Передо мной стоит задача максимально снизить трудозатраты при добавлении новых языков, и очень не хотелось бы создавать отдельный массив с буквами в алфавитном порядке для каждого языка.

-~{}~ 05.09.10 12:10:

про SORT_STRING говорить не стоит...
 

ХакИрФсимагущий

[засикречино]
У вас символы раставляются по принципу того как они расположины в кодировке. Думаю вам нужно покопать в этом направлении:
PHP:
function UtfWin($str){
static $conv=»;
if (!is_array ( $conv )){
$conv=array ();
for ( $x=128; $x <=143; $x++ ){
$conv['utf'][]=chr(209).chr($x);
$conv['win'][]=chr($x+112);
}
for ( $x=144; $x <=191; $x++ ){
$conv['utf'][]=chr(208).chr($x);
$conv['win'][]=chr($x+48);
}
$conv['utf'][]=chr(208).chr(129);
$conv['win'][]=chr(168);
$conv['utf'][]=chr(209).chr(145);
$conv['win'][]=chr(184);
}
return str_replace ( $conv['utf'], $conv['win'], $str );
}
это функция перекодирывания из ютф 8 в вин 1251

Пологаю можно выташить из пхп табицу символов любой кодировки и работать уже с ней как например работает функция выше а порядок букв выводить цыклом.
первый цикл с буквы а до е
второй буква ё
третий с ж до ё
а дальше как вам угодно.

В итоги почти любая добавка языка будет сводится к таблице кодировки этого языка
 

iSlayter

Новичок
То есть предлагаемое вами решение - это конвертировать в нативную кодировку этого языка mb_convert_encoding(), потом уже производить сортировку, и только потом загонять обратно в utf.

Сейчас попробую. Думается мне это будет весьма ресурсоёмким решением.

-~{}~ 05.09.10 13:31:

Наверное лучше сначала: implode/mb_convert_encoding/explode/sort/implode/mb_convert_encoding/result - так хотя бы не придётся использовать array_map.
 

ХакИрФсимагущий

[засикречино]
И я предлогал работать с кодировками на более низком уровне. Ваше решение более просто реализуемо но ресурсоемкое

а почему нельзя после добовления языка просто сохранить данне и потом использывать уже сохраненный массив, а не каждый раз шитать где какая буква?
 

iSlayter

Новичок
При описанном мною методе получилось что буква ё стала первой, блин. Работать с кодировками на столь низком уровне это, простите, пинзец! Особенно с учетом того, что там есть арабский да иврит, где все буквы на одно лицо и алфавит вообще хрен поймёшь какой.

Почему-то есть абсолютная уверенность в том, что кто-то уже решал эту проблему!
 

ХакИрФсимагущий

[засикречино]
может KOI русская даст правильный вывод?
или еше какая русская кодировка

-~{}~ 05.09.10 13:56:

Кодировка KOI8 (RFC1489) - используется в большинстве OS UNIX;

Кодировка MS DOS (CP866) - используется в OS MS DOS 6.22 для IBM PC;

Кодировка MS Windows (CP1251) - используется в MS Windows;

Кодировка ISO 8859-5 - используется в OS UNIX на компьютерах DEC и SUN;

Кодировка Mac OS - используется в машинах Macintosh и Apple.

Жаль что везде в таблицах буква ё отдельна что не обнадеживает(
 

baev

‹°°¬•
Команда форума
про SORT_STRING говорить не стоит...
— угу.
Стоит говорить про SORT_LOCALE_STRING
И, естественно, перед сортировкой нужно выставить правильно локаль.


Вообще, топик — феерический…
 

iSlayter

Новичок
так надо mysql попробовать...

-~{}~ 05.09.10 14:09:

baev, иногда лучше жевать, чем писать - попробуйте проверить то, что вы предлагаете.
 

ХакИрФсимагущий

[засикречино]
только что мысль пришла думаю что в русских кодировках ё это не буква а символ в русском алфавите то 33 буквы а надо 32

-~{}~ 05.09.10 14:12:

тоесть проблем с остальными языками где алфовит <=32 проблем небудет.
 

baev

‹°°¬•
Команда форума
iSlayter, не имею привычки писать что-либо, предварительно не проверив.
См. выше — НУЖНО ПЕРЕД СОРТИРОВКОЙ УСТАНОВИТЬ ПРАВИЛЬНО ЛОКАЛЬ

Под виндой
PHP:
<?php
setlocale(LC_ALL, "Russian_Russia.1251");
$s=array("й","ц","у","к","е","н","г","ш","щ","з","х","ъ","ф","ы","в","а","п","р","о","л","д","ж","э","я","ч","с","м","и","т","ь","б","ю","ё");
sort($s, SORT_LOCALE_STRING);
 echo "<pre>";
print_r($s);
/*
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] => я
)
*/
?>
 

iSlayter

Новичок
baev, извините, пожалуйста, что я вам нагрубил и невнимательно читал мануал.

проблемы ушли... со всех языков кроме белорусского - на всех локалях I стоит впереди всех

-~{}~ 05.09.10 16:15:

ой, а там была проблема в том, что буква i была из английского.

спасибо большое
 
Сверху