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

Php ksort在处理字母数字字符时产生错误的结果,php,sorting,ksort,Php,Sorting,Ksort,为什么ksort会给出错误的结果?尝试ksort($a,SORT\u STRING)强制对键进行字符串比较。您需要使用SORT\u STRING标志。SORT_REGULAR会将项目与其当前类型进行比较,在这种情况下,数字1确实位于字符串“a”之后: Array ( [0] => 84 [a] => 7833 [b] => 225 [c] => 341 [d] => 1297 [1] => 67 [2]

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

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

您需要使用SORT\u STRING标志。SORT_REGULAR会将项目与其当前类型进行比较,在这种情况下,数字1确实位于字符串“a”之后:

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

有关php中不同排序函数的概述,请参见本页:

如果要按键排序,请使用asort(),它将生成以下输出:

php -r "echo 1 > 'a' ? 'yes' : 'no';" // yes
这将有助于:

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

在此处签出其他排序标志


干杯

默认排序使用
常规排序

这将按照手册页面上的说明获取值并进行比较。用于将示例中的字符串键与零进行比较的时间;这些字符串被转换为数字(所有
0
)进行比较。如果两个成员比较相等,则它们在排序数组中的相对顺序未定义。(引自)

如果您希望排序后的输出在字母之前有数字,那么从PHP5.4开始,应该使用
SORT\u NATURAL
<代码>排序\u字符串仅在数字保持为单个数字时才执行此操作

SORT_NATURAL(PHP 5.4或更高版本)按以下顺序给出键:

<?php ksort($a,SORT_STRING); ?>
0,1,2,4,11,a,b,c
排序\u字符串提供按以下顺序排列的键:

<?php ksort($a,SORT_STRING); ?>
0,1,2,4,11,a,b,c

对于小于5.4的PHP,可以使用
uksort()
代替
SORT\u NATURAL

ksort(数组,排序类型)
根据键对指定排序类型(
sortingtype
)的关联数组按升序排序。但由于
sortingtype
的默认值为
SORT\u REGULAR
,因此当键包含数字和字符串组合时,会出现意外行为

您必须始终记住显式指定排序类型,以避免将数字与字符串混淆

uksort($a, 'strnatcmp');

< /P>你认为正确的结果是什么?我需要得到基于ASCII表顺序排序的索引。<代码> 10 < /代码> GO,在代码< 1代码>代码>和<代码> 2 <代码>之后,还是在<代码> 9 > /代码>?@ Salathe——根据ASCII顺序“10”不能在“9”之后,对吗?我明白你的意思,但如果ASCII顺序是OP想要的,好吧。

10
不是ASCII字符(它是两个字符),所以说“ASCII顺序”没有意义,因此要求澄清。+1你是这里唯一回答问题“为什么ksort给出错误结果?”的人。@Wh1T3h4Ck5你是对的。仅仅给出解决方案可能有助于解决我们的问题。但这并不能帮助我们提高编程技能。我迫不及待地要问下面的问题,“为什么ksort SORT\u STRING会给出错误的结果?”当他的数字键变成多个数字时。这不是对键排序,而是对值排序。
$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";
}