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 дает неверный результат?
5 answers
Вы захотите использовать флаг 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_flags здесь http://www.php.net/manual/es/function.sort.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
)