【问题标题】:ksort produces wrong result when dealing with alphanumeric charactersksort 在处理字母数字字符时会产生错误的结果
【发布时间】:2012-03-24 16:07:13
【问题描述】:
<?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会给出错误的结果?

【问题讨论】:

  • 您认为正确的结果如何?
  • 我需要根据 ASCII 表的顺序对索引进行排序。
  • 10 会去哪里,在12 之间或在9 之后?
  • @salathe - 根据 ASCII 顺序,'10' 不能在 '9' 之后,对吗?我明白你的意思,但如果 ASCII 顺序是 OP 想要的,那很好。
  • 10 不是 ASCII 字符(它是两个字符),所以说“ASCII 顺序”没有意义,因此要求澄清。

标签: php sorting ksort


【解决方案1】:

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

php -r "echo 1 > 'a' ? 'yes' : 'no';" // yes

【讨论】:

  • +1 您是这里唯一回答“为什么 ksort 给出错误结果?”问题的人
  • @Wh1T3h4Ck5 你是对的。仅仅给出解决方案可能有助于解决我们的问题。但不会帮助我们提高编程技能。
  • 我等不及后续问题了,“为什么 ksort SORT_STRING 给出错误的结果?”当他的数字键变成多位数字时。
【解决方案2】:

默认排序使用SORT_REGULAR

这会按照comparison operators 手册页中的说明获取值并比较它们。在您的示例中,当字符串键与零进行比较时;这些字符串被转换为数字(全部为0)以进行比较。 如果两个成员比较相等,则它们在排序数组中的相对顺序是不确定的。(引自usort() manual page。)

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

对于低于 5.4 的 PHP,SORT_NATURAL 的替代方法是使用 uksort()

uksort($a, 'strnatcmp');

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      这将起作用:

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

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

      干杯!

      【讨论】:

        【解决方案5】:

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

        PHP documentation on ksort

        【讨论】:

          【解决方案6】:

          查看此页面以了解 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
          )
          

          【讨论】:

          • 这不是对键进行排序,而是对值进行排序。
          猜你喜欢
          • 1970-01-01
          • 2016-02-20
          • 2015-01-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-07-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多