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 дает неправильный результат?

6 ответов

Решение

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

php -r "echo 1 > 'a' ? 'yes' : 'no';" // yes

Сортировка по умолчанию использует 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');

Пытаться ksort($a, SORT_STRING) заставить сравнения строк на ключах.

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

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

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

Ура!

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 документация по ксорту

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