5
<?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给出错误的结果?

4

6 回答 6

11

您需要使用 SORT_STRING 标志。SORT_REGULAR 会将项目与其当前类型进行比较,在这种情况下,数字 1 确实出现在字符串 'a' 之后:

php -r "echo 1 > 'a' ? 'yes' : 'no';" // yes
于 2012-03-24T16:12:00.000 回答
10

默认排序使用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低于 5.4 的 PHP的替代方案是使用uksort().

uksort($a, 'strnatcmp');
于 2012-03-24T16:16:05.163 回答
1

尝试ksort($a, SORT_STRING)强制对键进行字符串比较。

于 2012-03-24T16:11:08.580 回答
1

这将起作用:

<?php ksort($a,SORT_STRING); ?>

在此处查看其他 sort_flags http://www.php.net/manual/es/function.sort.php

干杯!

于 2012-03-24T16:12:59.513 回答
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";
}

关于 ksort 的 PHP 文档

于 2018-10-22T17:50:09.653 回答
-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
)
于 2012-03-24T16:12:55.517 回答