1

Тема: php. проблема сортировки массива с украинскими словами

суть такова... есть масив

$arr = array( 'макака', 'абрикос', 'інвестор', 'ємен' );

print_r($arr);
Array
(
   [0] => макака
   [1] => абрикос
   [2] => інвестор
   [3] => ємен
)

asort($arr);

а сортировка делает чепуху:

print_r($arr);
Array
(
   [2] => інвестор
   [3] => ємен
   [1] => абрикос
   [0] => макака
)

тобишь буквы "і" и "є" ставит на первое место, хотя по алфавиту это далеко не так...
как с эти бороться?

2

Re: php. проблема сортировки массива с украинскими словами

http://sgehrig.wordpress.com/2008/09/24 … 8-strings/

может поможет

3

Re: php. проблема сортировки массива с украинскими словами

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

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($array, 'sort_uk');

Отредактировано Sergic (2010-02-25 20:39:57)

4

Re: php. проблема сортировки массива с украинскими словами

Попробуйте

    setlocale(LC_ALL, 'uk_UA.UTF8');
    asort($array, SORT_LOCALE_STRING);