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

时间:2012-03-24 16:07:13

标签: 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);

上面的代码产生以下输出。

Array
(
    [0] => 84
    [a] => 7833
    [b] => 225
    [c] => 341
    [d] => 1297
    [1] => 67
    [2] => 44
    [3] => 24
    [4] => 22
)

为什么 ksort 会给出错误的结果?

6 个答案:

答案 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";
}

https://github.com/Microsoft/TypeScript/issues/9998

答案 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
)