<?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 会给出错误的结果?
答案 0 :(得分:11)
您需要使用SORT_STRING标志。 SORT_REGULAR会将项目与其当前类型进行比较,在这种情况下,数字1确实出现在字符串'a'之后:
php -r "echo 1 > 'a' ? 'yes' : 'no';" // yes
答案 1 :(得分:9)
默认排序使用SORT_REGULAR
。
这将获取值并按comparison operators手册页中所述进行比较。对于在您的示例中将字符串键与零进行比较的时间;这些字符串将转换为数字(所有0
)进行比较。 如果两个成员比较相等,则它们在排序数组中的相对顺序是未定义的。(引自usort() manual page。)
如果您希望排序的输出在字母前面有数字,那么从PHP 5.4开始应该使用SORT_NATURAL
。如果数字仍为单个数字,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
对于PHP小于5.4的SORT_NATURAL
的替代方法,将使用uksort()
。
uksort($a, 'strnatcmp');
答案 2 :(得分:1)
尝试ksort($a, SORT_STRING)
强制对字符串进行字符串比较。
答案 3 :(得分:1)
这将有效:
<?php ksort($a,SORT_STRING); ?>
在此处查看其他sort_flags http://www.php.net/manual/es/function.sort.php
干杯!
答案 4 :(得分:0)
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";
}
答案 5 :(得分:-1)
有关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
)