ksort выдает неверный результат при работе с буквенно-цифровыми символами


<?php

    $a = array(
        'a'=>'7833',
        'd'=>'1297',
        'c'=>'341',
        '1'=>'67',
        'b'=>'225',
        '3'=>'24',
        '2'=>'44',
        '4'=>'22',
        '0'=>'84'
    );

    ksort($a);

    print_r($a);

Приведенный выше код выдает следующий результат.

Array
(
    [0] => 84
    [a] => 7833
    [b] => 225
    [c] => 341
    [d] => 1297
    [1] => 67
    [2] => 44
    [3] => 24
    [4] => 22
)

Почему ksort дает неверный результат?

Author: Habeeb Perwad, 2012-03-24

5 answers

Вы захотите использовать флаг SORT_STRING. SORT_REGULAR будет сравнивать элементы с их текущими типами, и в этом случае число 1 действительно идет после строки "a":

php -r "echo 1 > 'a' ? 'yes' : 'no';" // yes
 11
Author: Andrew Kandels, 2012-03-24 16:12:00

Сортировка по умолчанию использует SORT_REGULAR.

Это принимает значения и сравнивает их, как описано на странице руководства операторы сравнения. Для случаев, когда строковые ключи в вашем примере сравниваются с нулем; эти строки преобразуются в числа (все 0) для сравнения. Если два элемента сравниваются как равные, их относительный порядок в отсортированном массиве не определен. (Цитируется из страницы руководства usort().)

Если вы хотите отсортировать для вывода чисел перед буквами вы должны использовать SORT_NATURAL начиная с PHP 5.4. SORT_STRING также выполнит работу только, если числа останутся однозначными.

SORT_NATURAL (PHP 5.4 или выше) предоставляет ключи, упорядоченные следующим образом:

0,1,2,4,11,a,b,c

Строка SORT_STRING содержит ключи, упорядоченные следующим образом:

0,1,11,2,4,a,b,c

Альтернативой SORT_NATURAL для PHP менее 5.4 было бы использование uksort().

uksort($a, 'strnatcmp');
 8
Author: salathe, 2012-03-24 16:21:12

Попробуйте ksort($a, SORT_STRING) принудительно сравнить строки ключей.

 1
Author: Marc B, 2012-03-24 16:11:08

Это будет работать:

<?php ksort($a,SORT_STRING); ?>

Проверьте другие sort_flags здесь http://www.php.net/manual/es/function.sort.php

Ура!

 1
Author: fsodano, 2012-03-24 16:12:59

Смотрите эту страницу для обзора различных функций сортировки в php: http://php.net/manual/en/array.sorting.php

Если вы хотите, чтобы он был отсортирован по ключу, используйте функцию asort(), которая выдает следующий вывод:

Array
(
    [4] => 22
    [3] => 24
    [2] => 44
    [1] => 67
    [0] => 84
    [b] => 225
    [c] => 341
    [d] => 1297
    [a] => 7833
)
 -1
Author: lukassteiner, 2012-03-24 16:12:55