<?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);
Run Code Online (Sandbox Code Playgroud)
上面的代码产生以下输出.
Array
(
[0] => 84
[a] => 7833
[b] => 225
[c] => 341
[d] => 1297
[1] => 67
[2] => 44
[3] => 24
[4] => 22
)
Run Code Online (Sandbox Code Playgroud)
为什么ksort会给出错误的结果?
And*_*els 11
您将要使用SORT_STRING标志.SORT_REGULAR会将项目与其当前类型进行比较,在这种情况下,数字1确实在字符串'a'之后:
php -r "echo 1 > 'a' ? 'yes' : 'no';" // yes
Run Code Online (Sandbox Code Playgroud)
默认排序使用SORT_REGULAR
.
这将获取值并按照比较运算符手册页中的描述进行比较.对于在您的示例中将字符串键与零进行比较的时间; 这些字符串将转换为数字(全部0
)以进行比较. 如果两个成员比较相等,则它们在排序数组中的相对顺序是未定义的.(引自usort()手册页.)
如果你希望排序的输出在字母之前有数字,你应该使用SORT_NATURAL
PHP 5.4. 只有当数字保持个位数时SORT_STRING
才会完成工作.
SORT_NATURAL(PHP 5.4或更高版本)按键排序为:
0,1,2,4,11,a,b,c
Run Code Online (Sandbox Code Playgroud)
SORT_STRING按键排序为:
0,1,11,2,4,a,b,c
Run Code Online (Sandbox Code Playgroud)
SORT_NATURAL
可以使用PHP小于5.4 的替代方法uksort()
.
uksort($a, 'strnatcmp');
Run Code Online (Sandbox Code Playgroud)