1 Востаннє редагувалося Daren (16.11.2017 21:39:45)

Тема: Сортування масиву з укр мовою. php.

Вітаю.

Плавав по гуглу і натрапив на одну з тем цього форуму.
http://replace.org.ua/topic/3410/
І хоча там є, вроді як, робочий приклад, але в мене все одно не працює.

Є асоціативний масив. "текст" => "номери сторінок".
Сортую по тексту.

echo "<pre>";
setlocale(LC_ALL, 'uk_UA');
ksort($positions, SORT_LOCALE_STRING);
var_dump($positions);
exit;

запросив список укр локалів хостера:
uk_UA
uk_UA.koi8u
uk_UA.utf8
деякі сортують норм все, крім "і", "є". інші взагалі фігню видають.

ну, думаю, фіг з ним. пишу так:

uksort($positions, function ($a, $b) {
    $alphabet = 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, '~' =>  33, '–' =>  34,
        
        '0' =>  40, '1' =>  41, '2' =>  42, '3' =>  43, '4' =>  44, '5' =>  45, '6' =>  46, '7' =>  47, '8' =>  48, '9' =>  49,
        
        'А' =>  50, 'Б' =>  51, 'В' =>  52, 'Г' =>  53, 'Ґ' =>  54, 'Д' =>  55, 'Е' =>  56, 'Є' =>  57, 'Ж' =>  58, 'З' =>  59,
        'И' =>  60, 'І' =>  61, 'Ї' =>  62, 'Й' =>  63, 'К' =>  64, 'Л' =>  65, 'М' =>  66, 'Н' =>  67, 'О' =>  68, 'П' =>  69,
        'Р' =>  70, 'С' =>  71, 'Т' =>  72, 'У' =>  73, 'Ф' =>  74, 'Х' =>  75, 'Ц' =>  76, 'Ч' =>  77, 'Ш' =>  78, 'Щ' =>  79,
        'Ь' =>  80, 'Ю' =>  81, 'Я' =>  82,
        'а' =>  90, 'б' =>  91, 'в' =>  92, 'г' =>  93, 'ґ' =>  94, 'д' =>  95, 'е' =>  96, 'є' =>  97, 'ж' =>  98, 'з' =>  99,
        'и' => 100, 'і' => 101, 'ї' => 102, 'й' => 103, 'к' => 104, 'л' => 105, 'м' => 106, 'н' => 107, 'о' => 108, 'п' => 109,
        'р' => 110, 'с' => 111, 'т' => 112, 'у' => 113, 'ф' => 114, 'х' => 115, 'ц' => 116, 'ч' => 117, 'ш' => 118, 'щ' => 119,
        'ь' => 120, 'ю' => 121, 'я' => 122, 'ы' => 123,
        'A' => 130, 'B' => 131, 'C' => 132, 'D' => 133, 'E' => 134, 'F' => 135, 'G' => 136, 'H' => 137, 'I' => 138, 'J' => 139,
        'K' => 140, 'L' => 141, 'M' => 142, 'N' => 143, 'O' => 144, 'P' => 145, 'Q' => 146, 'R' => 147, 'S' => 148, 'T' => 149,
        'U' => 150, 'V' => 151, 'W' => 152, 'X' => 153, 'Y' => 154, 'Z' => 155,
        'a' => 160, 'b' => 161, 'c' => 162, 'd' => 163, 'e' => 164, 'f' => 165, 'g' => 166, 'h' => 167, 'i' => 168, 'j' => 169,
        'k' => 170, 'l' => 171, 'm' => 172, 'n' => 173, 'o' => 174, 'p' => 175, 'q' => 176, 'r' => 177, 's' => 178, 't' => 179,
        'u' => 180, 'v' => 181, 'w' => 182, 'x' => 183, 'y' => 184, 'z' => 185
    ); 
    
    $len_a = mb_strlen($a, 'Windows-1251');
    $len_b = mb_strlen($b, 'Windows-1251');
    if ($len_a < $len_b) {
        $len = $len_a;
        $short = 1;
    } else {
        $len = $len_b;
        $short = 2;
    }
    
    $toggle = 0;
    for ($i = 0; $i < $len; $i++){
        if ($alphabet[$a[$i]] < $alphabet[$b[$i]]) {
            $toggle = 1;
        } elseif ($alphabet[$a[$i]] > $alphabet[$b[$i]]) {
            $toggle = 2;
        }
    }
    if ($toggle == 1) {            // якщо перший вище по алфавіту
        return 1;
    } elseif ($toggle == 2) {
        return -1;
    } elseif ($short == 1) {     // якщо однакові, але перший коротший
        return 1;
    } else {
        return -1;
    }
});

var_dump($positions);
exit;

і все одно не сортує.

Що я роблю не так? Чи можна якось по іншому це запрожити?

2 Востаннє редагувалося koala (16.11.2017 22:22:21)

Re: Сортування масиву з укр мовою. php.

Тут немає алгоритму сортування.

3

Re: Сортування масиву з укр мовою. php.

koala написав:

Тут немає алгоритму сортування.

Всередині в колбек функції?
Я думав, що там треба було просто вказати механізм порівняння 2х елементів, і далі воно само.