ksort дает неверный результат при работе с буквенно-цифровыми символами - PullRequest
5 голосов
/ 24 марта 2012
<?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 дает неправильный результат?

Ответы [ 6 ]

11 голосов
/ 24 марта 2012

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

php -r "echo 1 > 'a' ? 'yes' : 'no';" // yes
9 голосов
/ 24 марта 2012

Для сортировки по умолчанию используется 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');
1 голос
/ 24 марта 2012

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

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

Оформить другие флаги сортировки здесь http://www.php.net/manual/es/function.sort.php

Ура!

1 голос
/ 24 марта 2012

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

0 голосов
/ 22 октября 2018

ksort(array, sortingtype) сортирует ассоциативный массив в порядке возрастания, в соответствии с ключами, для указанного типа сортировки (sortingtype). Но поскольку sortingtype имеет значение по умолчанию SORT_REGULAR, когда ключи имеют комбинацию из чисел и строк, возникает такое неожиданное или неожиданное поведение.

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

$a = array('a'=>'7833','d'=>'1297','c'=>'341','1'=>'67','b'=>'225','3'=>'24','2'=>'44','4'=>'22','0'=>'84');
ksort($a, SORT_STRING);
foreach ($a as $key => $val) {
    echo "$key = $val\n";
}

PHP документация по ksort

0 голосов
/ 24 марта 2012

См. Эту страницу для обзора различных функций сортировки в 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
)
...