Как вычислить английские буквы в русских словах и наоборот?

Тема в разделе "PHP", создана пользователем sasha_ua, 16 фев 2011.

Модераторы: latteo
  1. sasha_ua

    sasha_ua Постоялец

    Регистр.:
    23 июн 2010
    Сообщения:
    66
    Симпатии:
    0
    Имеется массив:

    PHP:
    $array = array("Волга","Дом","Барабан","Aрбуз");
    Если его отсортировать, то результат будет следующим:

    В слове арбуз буква 'A' набрана в английской раскладке, и следовательно сортировка выполняется неправильно.

    Как бороться с данной проблемой?
     
  2. gts

    gts

    Регистр.:
    12 сен 2010
    Сообщения:
    271
    Симпатии:
    42
    Регулярками ищешь вхождения латиницы
     
  3. phantom

    phantom Постоялец

    Регистр.:
    17 апр 2006
    Сообщения:
    129
    Симпатии:
    14
    Напрашивается вариант: предварительно заменить все латинские буквы, похожие по начертанию, на русские :)
    Вот готовая реализация на php: http://forum.searchengines.ru/showpost.php?p=2761012&postcount=13
     
  4. sasha_ua

    sasha_ua Постоялец

    Регистр.:
    23 июн 2010
    Сообщения:
    66
    Симпатии:
    0
    Дело в том что слова на 2х языках то на англ. то на русском.
    Т.е. нужно определить сначала к какому языку относится слово.

    Я так понимаю слово нужно перебирать посимвольно и проверять на попадание в определенный промежуток.
    Потом посчитать в каком соотношении рус и англ символы и сделать вывод во что конвертировать.

    Я не сильно ориентируюсь в кодировках, но может можно как-то получать код utf символа и таким образом определять к какому языку он относится?

    Что-то типа [a-zA-Z]?
    Но как наоборот рус->eng, разве есть [а-яА-Я]? Или нужно перечислить [абвг...яАБВГ...Я]
     
  5. ZCFD

    ZCFD

    Регистр.:
    16 янв 2008
    Сообщения:
    989
    Симпатии:
    437
    есть [а-яА-Я]

    + не нужен код utf , в ASCI-коды символов тоже отличаются ( ord() )
     
  6. VandJ

    VandJ

    Регистр.:
    8 апр 2008
    Сообщения:
    318
    Симпатии:
    113
    PHP:
    <?php
    $array 
    = array("Rука","Dом","Sобака","Aрбуз");
        
    $ru = array('А','Д','С','Р');
        
    $en = array('A','D','S','R');
    for(
    $i=0$i<count($array); $i++) $array[$i] = str_replace($en$ru$array[$i]);
    sort($array);
    print_r ($array); //Array ( [0] => Арбуз [1] => Дом [2] => Рука [3] => Собака )
    ?>
    PS. Может, есть способы и проще…
     
  7. ZCFD

    ZCFD

    Регистр.:
    16 янв 2008
    Сообщения:
    989
    Симпатии:
    437
    вместо цикла можно использовать
    PHP:
    $arr_replace=array("А"=>"A","В"=>"B","С"=>"C");
    echo 
    strtr($text,$arr_replace);
     
  8. VandJ

    VandJ

    Регистр.:
    8 апр 2008
    Сообщения:
    318
    Симпатии:
    113
    Цикл появился, из-за обработки массива $array . В вашем же примере обрабатывается, текстовая строка.
    А так, принцип тот же
    PHP:
    $array = array("Rука","Dом","Sобака","Aрбуз");
    $arr_replace=array("A"=>"А","D"=>"Д","S"=>"С","R"=>"Р"); 
    for(
    $i=0$i<count($array); $i++) $array[$i] = strtr($array[$i],$arr_replace); 
    sort($array);
    print_r ($array); //Array ( [0] => Арбуз [1] => Дом [2] => Рука [3] => Собака )