处理字母数字字符时,ksort产生错误的结果

Hab*_*wad 5 php sorting 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);
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)


sal*_*the 9

默认排序使用SORT_REGULAR.

这将获取值并按照比较运算符手册页中的描述进行比较.对于在您的示例中将字符串键与零进行比较的时间; 这些字符串将转换为数字(全部0)以进行比较. 如果两个成员比较相等,则它们在排序数组中的相对顺序是未定义的.(引自usort()手册页.)

如果你希望排序的输出在字母之前有数字,你应该使用SORT_NATURALPHP 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)