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: 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
)