За последние 24 часа нас посетили 17143 программиста и 1627 роботов. Сейчас ищут 1213 программистов ...

Сортировка средствами PHP

Тема в разделе "Прочие вопросы по PHP", создана пользователем stavr, 28 июл 2006.

  1. stavr

    stavr Активный пользователь

    С нами с:
    28 июл 2006
    Сообщения:
    8
    Симпатии:
    0
    Hi All!

    Есть задача отсортирвать список... Средствами MySQL не получается, так как в базе строки криптованы. Остается только скриптом PHP, перед выводом юзеру. Нет проблем - загоняем в массив. Сортируем - выводим - нет проблем, списки небольшие и все работает. Но... кирилица сортируется через ж..., абцд... и т.д. Строки в кодировке koi8r ессно... Как объяснить PHP что он сортирует кодировку koi8? Или есть какие -нить другие (гуманные) способы эту задачу решить? :)
     
  2. Vah

    Vah Активный пользователь

    С нами с:
    15 май 2006
    Сообщения:
    228
    Симпатии:
    0
    копай в сторону setlocale()
     
  3. stavr

    stavr Активный пользователь

    С нами с:
    28 июл 2006
    Сообщения:
    8
    Симпатии:
    0
    Порыл :)

    поставил setlocale(LC_ALL,"ru_RU.koi8r")

    поссле чего порядок сортирвки функцией natcasesort
    изменился, но один фик непонятно на что... если кодировка
    cp1251 то почти идеально, тока буква Ё раньше буквы А, а тут ваще какя-то хрень... заморачиваться с перекодирокой koi8<->cp1251 чей-то совсем не хочетца... Локаль ru_RU.koi8r в системе есть одназначна... В чем туплю? ;)
     
  4. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    Пробуй все локали которые видишь, пока не наткнешься на нужную
     
  5. stavr

    stavr Активный пользователь

    С нами с:
    28 июл 2006
    Сообщения:
    8
    Симпатии:
    0
    эх дык, ну ладна мутим (система под которой мутиться все линух слака 10-я)

    # locale -a

    из кучи высранного выбираем все что начинается с ru - надеюсь не предлагаете пробовать апсалютна все что есть - я этого не переживу :) и мутим простенький тестовый скриптик:

    <?php

    setlocale(LC_ALL,"ru_RU");
    #setlocale(LC_ALL,"ru_RU.koi8r");
    #setlocale(LC_ALL,"ru_RU.utf8");
    #setlocale(LC_ALL,"ru_UA");
    #setlocale(LC_ALL,"ru_UA.utf8");
    $array = array("й<br>","ц<br>","у<br>","к<br>","е<br>","н<br>","г<br>","ш<br>","щ<br>","з<br>","х<br>",
    "ъ<br>","ф<br>","ы<br>","в<br>","а<br>","п<br>","р<br>","о<br>","л<br>","д<br>","ж<br>",
    "я<br>","ч<br>","с<br>","м<br>","и<br>","т<br>","ь<br>","б<br>","ю<br>","ё<br>","Й<br>",
    "Ц<br>","У<br>","К<br>","Е<br>","Н<br>","Г<br>","Ш<br>","Щ<br>","З<br>","Х<br>","Ъ<br>",
    "Ф<br>","Ы<br>","В<br>","А<br>","П<br>","Р<br>","О<br>","Л<br>","Д<br>","Ж<br>","Э<br>",
    "Я<br>","Ч<br>","С<br>","М<br>","И<br>","Т<br>","Ь<br>","Б<br>","Ю<br>","Ё<br>","1<br>",
    "10<br>","а10<br>","б1<br>");
    natcasesort($array);
    print_r($array);
    ?>


    реально меняет сортировку только ru_RU, и то беспорядочно, а аостальное приводит к абцд...., тоесть фигня...
    То ли локаль в линухе криво стоит толи пхп ее криво отрабатывает :(
     
  6. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    а кодировку самого файла то меняете?
     
  7. L

    L Активный пользователь

    С нами с:
    28 июл 2006
    Сообщения:
    45
    Симпатии:
    0
    php криво отрабатывает-надо его перекомпилировать...
     
  8. stavr

    stavr Активный пользователь

    С нами с:
    28 июл 2006
    Сообщения:
    8
    Симпатии:
    0
    ясен пень :)
     
  9. stavr

    stavr Активный пользователь

    С нами с:
    28 июл 2006
    Сообщения:
    8
    Симпатии:
    0
    а вот отсюда поподробнее плз. С какой стороны пнуть его в печень чтоб он не вытворял подобного? :)

    ПХП юзается версии 4.3.10
     
  10. L

    L Активный пользователь

    С нами с:
    28 июл 2006
    Сообщения:
    45
    Симпатии:
    0
    ./configure --with-mod_charset в исходной директории пхп
     
  11. stavr

    stavr Активный пользователь

    С нами с:
    28 июл 2006
    Сообщения:
    8
    Симпатии:
    0
    Пересобрал... и тот же фиг :(

    Придетца видимо посмотреть в сторону strtr(), перекодировать сначала в ср1251 отсортировать а потом назад.... Абидна, дасадна, ну ладна.... :(
     
  12. stavr

    stavr Активный пользователь

    С нами с:
    28 июл 2006
    Сообщения:
    8
    Симпатии:
    0
    Ну значит помучался я еще помучался.... и послал пхп, локаль и natcasesort бабаю нах и сделал так

    ----------------------------------
    // ставим аглицкую локаль (благо есть везде и работает одинаково)
    setlocale(LC_ALL,"en.US");

    // извлекаем строки из базы MySQL
    ....
    while (...) {

    // извлекаем строку
    ...
    // перекодируем
    $Str = strtr($Str,"аАбБвВгГдДеЕёЁжЖзЗиИйЙкКлЛмМнНоОпПрРсСтТуУфФхХцЦчЧшШщЩъЪыЫьЬэЭюЮяЯ",
    "ёЁюабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ");

    // пихаем в массив
    ....
    }

    // сортируем массив
    asort($Text);

    // выводим из массива в отсортированном виде
    reset($Text);
    while (list($Key,$Str)=each($Text)) {

    // перекодируем обратно в исходное состояние
    $Str = strtr($Str,"ёЁюабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ",
    "аАбБвВгГдДеЕёЁжЖзЗиИйЙкКлЛмМнНоОпПрРсСтТуУфФхХцЦчЧшШщЩъЪыЫьЬэЭюЮяЯ");

    // выводим куда требовалось
    .....
    }

    -----------------------------
    Вот. Кривовато, но умнее ничего в голову не пришло, но зато работет...