Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » PHP/MySQL: Сортировка по русскому алфавиту.

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2

Открыть новую тему     Написать ответ в эту тему

Minister



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здраствуйте, уважаемые дамы и господа!
У меня тут возникла небольшая проблемка.
Берутся данные из MySQL и выводятся на страничку.
Как мне сделать на PHP, чтобы эти данные сортировались по русскому алфавиту?




Уточнил название. — Svarga.

Всего записей: 76 | Зарегистр. 25-09-2001 | Отправлено: 07:40 29-09-2001 | Исправлено: Svarga, 20:44 06-10-2003
SlyfoX



XPrienced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Minister
Сортируй так же, как и обычные строки. PHP сортирует строки по ASCII-кодам, и эта сортировка приемлима для русских символов.

Всего записей: 1027 | Зарегистр. 20-04-2001 | Отправлено: 12:08 29-09-2001
Minister



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Да не сортирует он у меня по русскому алфавиту, а по англ. сортирует. Что еще можете предложить?

Всего записей: 76 | Зарегистр. 25-09-2001 | Отправлено: 14:14 29-09-2001
FatCat



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Хе-хе...конечно не сортирует, в MySQL вообще с этим проблема, лучше написатьвнешнюю функцию сортировки.
 
Я вот такую функцию использую, может и тебе поможет:
 

Код:
 
function cmp0 ($a, $b) {
 
global $sortby;
 
    return strcmp($a[$sortby],$b[$sortby]);
 
}
 
 
 
$eng_alphabet = array("All", "A","B","C","D","E","F","G","H","I","J","K","L","M",
 
                      "N","O","P","Q","R","S","T","U","V","W","X","Y","Z","Other");
 
$rus_alphabet = array("А","Б","В","Г","Д","Е","Ё","Ж","З","И","Й","К","Л","М","Н","О",
 
                      "П","Р","С","Т","У","Ф","Х","Ц","Ч","Ш","Щ","Ъ","Ы","Ь","Э","Ю","Я");
 
$rus_small = array("а","б","в","г","д","е","ё","ж","з","и","й","к","л","м","н","о",
 
                   "п","р","с","т","у","ф","х","ц","ч","ш","щ","ъ","ы","ь","э","ю","я");
 
 
 
 

 
Ну а потом ты в нужном месте просто применяешь заданные массивы:
 

Код:
 
function alpha() { //Creates the list of letters and makes them a link.
 
    global $sortby, $eng_alphabet, $rus_alphabet;
 
        $num = count($eng_alphabet) - 1;
 
        echo "<center>[ ";
 
        $counter = 0;
 
        while (list(, $ltr) = each($eng_alphabet)) {
 
            echo "<A HREF=\"memberslist.php?letter=$ltr&sortby=$sortby\">$ltr</a>";
 
            if ( $counter == round($num/2) ) {
 
                echo " ]\n<br>\n[ ";  
 
            } elseif ( $counter != $num ) {
 
                echo "&nbsp;|&nbsp;\n";
 
            }
 
            $counter++;
 
        }
 
        $num = count($rus_alphabet) - 1;
 
        echo " ]<br><br>[ \n\n\n";
 
        $counter = 0;
 
        while (list(, $ltr) = each($rus_alphabet)) {
 
            echo "<A HREF=\"memberslist.php?letter=$ltr&sortby=$sortby\">$ltr</a>";
 
            if ( $counter == round($num/2) ) {
 
                echo " ]\n<br>\n[ ";  
 
            } elseif ( $counter != $num ) {
 
                echo "&nbsp;|&nbsp;\n";
 
            }
 
            $counter++;
 
        }
 
         
 
        echo " ]\n</center>\n<br>\n";  // end of HTML
 
}
 
 

Всего записей: 346 | Зарегистр. 10-07-2001 | Отправлено: 02:05 30-09-2001
Guest

BANNED
Редактировать | Цитировать | Сообщить модератору
на сервере надо настроить кодировку (у меня стоит cp1251), и русскоязычные строки превосходно сортируются без всяких дополнительных фокусов. если можно сервер настроить - это сделать нужно. прописать кодировку в my.ini или еще куда надо. См. документацию.
 
Если же это невозможно, то можно сделать собственную функцию сравнения строк с русскими буквами и нагло отсортировать записи в скрипте..

Отправлено: 07:12 30-09-2001
Minister



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спасибо всем ответившим, а особенно FatCat за предоставленный код.
Не очень то хочется доставать своего хостера.

Всего записей: 76 | Зарегистр. 25-09-2001 | Отправлено: 12:17 30-09-2001
Minister



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
FatCat мне нужна не такая функция.
Вот посмотри сравнение двух страниц:
http://docs.gets.ru/index.html
и
http://docs.gets.ru/index_bug.html
 
Найдешь разницу.

Всего записей: 76 | Зарегистр. 25-09-2001 | Отправлено: 13:08 30-09-2001
Minister



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Приношу свои глубокие извинения по поводу сортировки, оказывается, что у меня на локальном сервере глючит, а выложил на сервер в сети, там работает нормально.
Спасибо всем!

Всего записей: 76 | Зарегистр. 25-09-2001 | Отправлено: 13:11 30-09-2001
Infection

iB3 PostgreSQL Coder
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
сделал локаль
 
localedef -c -i ru_RU -f CP1251 --no-archive ru_RU.CP1251
 
в скрипте прописал
@setlocale("LC_ALL", "ru_RU.cp1251");
делаю sort() и нифига!!
 
в чем трабла? может че в ini прописать?
 
Добавлено
если в чем, то компилил вот так вот:
 
'./configure' '--prefix=/opt/php' '--with-apache=../apache_1.3.28' '--enable-track-vars' '--enable-mod_charset' '--with-mysql=/opt/mysql' '--with-pgsql=/opt/pgsql' '--with-gd' '--with-zlib-dir=/lib'  
 
Добавлено
PHP Version 4.3.2
locale (GNU libc) 2.3.2
 
Добавлено
вообщем я добился сортировки, правда почему-то буква Ё стоит перед буквой А

Всего записей: 352 | Зарегистр. 21-12-2001 | Отправлено: 17:48 06-10-2003
Guitaristka



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
FatCat а можно отсюда и поподробнее.  
 

Цитата:
такую функцию использую
- а в каком файле и после каких строчек конкретно это добавить (или заменить?)
 

Цитата:
в нужном месте просто применяешь заданные массивы
- а можно места уточнить совсем конкретно?
 
У меня следующая проблем's:
не работает поиск русских слов (хотя они там есть). Что и куда мне вставить? Подскажите.

Всего записей: 23 | Зарегистр. 01-12-2004 | Отправлено: 03:56 04-12-2004
SiMM

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Guitaristka, не надо читать бредни 3хлетней давности и считать их абсолютной истиной. У вас проблемы с MySQL? Тогда вам нужно для начала прочесть PHP FAQ: MySQL - Неправильные поиск/сортировка русского текста. Что делать? Проблемы с PHP? Используйте setlocale

Всего записей: 2302 | Зарегистр. 14-05-2004 | Отправлено: 10:06 04-12-2004
Guitaristka



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SiMM
- я уже починила, все клево работает, спасибо!

Всего записей: 23 | Зарегистр. 01-12-2004 | Отправлено: 16:17 04-12-2004
Sky hawk



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Вообщем не знаю где точно нужно задать этот вопрос поэтому задам его тут:
есть форма отправки, в ней 22 чекбокса, пользователь отмечает необходимые ему к примеру 6ть и нажимает отправить, на результ. странице нужно увидеть его выбор не ввиде строчки например через запятую или не в один столбик, а чтобы они раномерно лажились в два или три равных стлобца т.е.  (по оси xy)
вида
<table>
<tr><td>Пицца 1</td> <td>Пицца 4</td></tr>
<tr><td>Пицца 2</td> <td>Пицца 5</td></tr>
<tr><td>Пицца 3</td> <td></td></tr>
</table>
Объяснил конечно криво, но как смог, если просто нужно понять при помощи чего php так сортирует данные.
p.s. или здесь необходимо итспользовать БД?

----------
Волгоград в Фейсбуке
АвтоТвиттер
© каждый имеет мнение как хочет.

Всего записей: 2153 | Зарегистр. 31-10-2003 | Отправлено: 21:40 22-02-2006
6epcepk



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Вот что пришло навскидку:
 

Код:
 
 
$number = ceil(count($array) / 2);
 
if ($number % 2 != 0) $number += 1; // Если нечетное, то прибавляем единицу.
 
 
foreach ($array as $k => $v) {
 
    $second_td = $number + $v;
 
    $new_array[] = array(
                                      "first_td" = > $v,
                                      "second_td" = >  $v[$second_td] // Значение чекбокса
                                    );
 
}
 
// А теперь делаем вывод:
foreach ($new_array as $k => $v) {
 
    ?>
 
    <tr>
      <td><?=$new_array[$k]['first_td']?></td>
      <td><?=$new_array[$k]['second_td']?></td>
   </tr>
 
    <?
 
}
 
 

 
 
Сорри за сырой вариант, но надеюсь алгоритм понятен (:
 
Добавлено:
Естественно только чекбоксы должны быть в ассоциативном массиве.

----------
comming soon..

Всего записей: 2603 | Зарегистр. 02-05-2003 | Отправлено: 00:05 23-02-2006
slogic



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
вообщем я добился сортировки, правда почему-то буква Ё стоит перед буквой А

Потому что в win-1251 код буквы Ё равен 168, а буквы А - 192.

Всего записей: 104 | Зарегистр. 12-08-2005 | Отправлено: 10:50 30-05-2006
imwerden

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Сортировка проблемы не вызвала, а вот дальнейшее усовершенствование списка (http://imwerden.de/avtory.html). Oтвета ищу уже много месяцев, но ничего не нашел....
 
Как сделать так, чтобы вверху страницы была строка алфавита с линками на разделы указателя по буквам, как здесь:  
 
http://rvb.ru/indices/author_index.htm

Всего записей: 14 | Зарегистр. 06-06-2014 | Отправлено: 10:50 30-03-2015 | Исправлено: imwerden, 12:04 10-05-2017
hawik



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
imwerden
именно как там, сделана через систему ссылок якорей.  
 
Погуглите "href якорь".
 
А вообще для поиска лучше использовать более продвинутые системы, такие как Sphinxsearch или Lucene.

Всего записей: 55 | Зарегистр. 30-11-2002 | Отправлено: 14:40 30-03-2015
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
imwerden
в чем сложность? лучше всего в таблице ввести дополнительное поле, в котором хранить букву. затем делать выборку с GROUP BY это поле.
либо более сложный запрос, сам вырезающий букву (займет больше времени).  
либо обработать уже в php полученные данные таким образом, собрав первые буквы в массив, а затем применив array_unique.

Всего записей: 15040 | Зарегистр. 20-09-2014 | Отправлено: 20:21 30-03-2015
imwerden

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Сложность в том, что нужна логическая подсказка. Теперь она есть и дело почти сделано. Остается только реализовать. Спасибо.

Всего записей: 14 | Зарегистр. 06-06-2014 | Отправлено: 23:08 30-03-2015
imwerden

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Пока не очень-то получается. Добавил поле с буквой в таблицу, но уже имеется группировка по публикациям на каждого автора. А как еще дополнительно сделать вторую группировку по буквам?
Внизу, понятно, не работает: перед каждым именем автора теперь имеется еще и буква....
В таблице imwerden_books находятся книги, в ячейках cid, cid2... номера авторов. Создается список авторов из imwerden_categories и в скобках после имен количество книг, с ними связанных:
 
$categoryquery = mysql_query("SELECT count(*), p.cid3, p.cid4, p.cid5, p.cid6, p.cid7, c.cid, c.avtor, c.bukva FROM imwerden_books as p LEFT JOIN imwerden_categories as c on (p.cid3=c.cid or p.cid4=c.cid or p.cid5=c.cid or p.cid6=c.cid or p.cid7=c.cid) WHERE c.cid > 199 AND c.cid < 700 group by c.cid ORDER BY c.avtor");
 
echo "<table width=\"100%\">";
$flag = 0;
while(list($row, $cid3, $cid4, $cid5, $cid6, $cid7, $catid, $catavtor, $bukva) = mysql_fetch_row($categoryquery))
{if ( $flag % 2 == 0) {echo "<tr>";}  
echo "<td><b>$bukva</b>  <h3><a href='http://imwerden.de/cat/modules.php?name=books&amp;pa=last_update&amp;cid=$catid'>$catavtor</a> ($row)</h3></td>\n";
if ( $flag == count( $categoryresquery) && $flag % 2 != 0) {
    echo "<td></td>";
} else {
    $flag ++ ;}}
echo "</tr></table>";

Всего записей: 14 | Зарегистр. 06-06-2014 | Отправлено: 14:55 10-04-2015
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2

Компьютерный форум Ru.Board » Интернет » Web-программирование » PHP/MySQL: Сортировка по русскому алфавиту.


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru