数组键被'uksort()'函数错误地排序

时间:2013-04-10 15:48:59

标签: php arrays sorting key

我有一个数组,其键的格式为[A1] - > [A20],[B1] - > [B20]等,我正在尝试使用第一个ksort()(以正确的顺序获取字母)然后uksort()对该数组进行排序。

但是,我无法弄清楚应该如何编写uksort()函数,并且我的数组键以奇怪的顺序返回。有人可以看一看并告知我做错了什么吗?感谢。

function _sort_selection_keys($a, $b){

    $let_a = substr($a, 0, 1);
    $let_b = substr($b, 0, 1);
    $num_a = intval(substr($a, 1));
    $num_a = intval(substr($b, 1));

    /** Check that the first letter is the same. It should be, as the array has already been through 'ksort()', but it's worth checking any way */
    if($let_a !== $let_b) :
        return strcasecmp($a, $b);
    endif;

    if($num_a > $num_b) :
        return -1;
    elseif($num_a = $num_b) :
        return 0;
    elseif($num_a < $num_b) :
        return 1;
    endif;

}

5 个答案:

答案 0 :(得分:4)

您可以使用符合您需求的 strnatcmp 功能:

uksort($array, 'strnatcmp');

@ M8R-1jmw5r提到的另一个解决方案

ksort($array, SORT_NATURAL);

答案 1 :(得分:1)

根据documentation for usort

  

如果第一个参数被认为分别小于,等于或大于第二个参数,则比较函数必须返回小于,等于或大于零的整数。

也就是说,您应该返回true(或进行比较并返回false$num_a - $num_b或{而不是返回-11。 {1}}。

答案 2 :(得分:1)

首先,我认为您需要做的就是将第二个“$ num_a”行更改为“$ num_b”。 除此之外,我只是在键上使用strnatcasecmp()而不是你正在尝试的所有解剖。

答案 3 :(得分:1)

如果不在那里调试代码,您可以使用uksort的内置功能,使用'strnatcmp'按字母顺序对键进行排序。

未排序的数组代码

$array = array(
    'A1' => array(),
    'A2' => array(),
    'A3' => array(),
    'A4' => array(),
    'C1' => array(),
    'B2' => array(),
    'B1' => array(),
    'D1' => array(),
    'C2' => array(),
    'B3' => array(),
    'D3' => array(),
    'D2' => array(),
);

uksort($array, 'strnatcmp');

var_dump($array);

<强>结果

array (size=12)
  'A1' => 
    array (size=0)
      empty
  'A2' => 
    array (size=0)
      empty
  'A3' => 
    array (size=0)
      empty
  'A4' => 
    array (size=0)
      empty
  'B1' => 
    array (size=0)
      empty
  'B2' => 
    array (size=0)
      empty
  'B3' => 
    array (size=0)
      empty
  'C1' => 
    array (size=0)
      empty
  'C2' => 
    array (size=0)
      empty
  'D1' => 
    array (size=0)
      empty
  'D2' => 
    array (size=0)
      empty
  'D3' => 
    array (size=0)
      empty

答案 4 :(得分:1)

您希望按自然顺序中的键对数组进行排序:

ksort($array, SORT_NATURAL);

请参阅ksort()

自然排序顺序是:

regular:  A1, A10, A11, A2, A20, A21, ... A3, ...
natural:  A1, A2, A3, ..., A10, A11, ... A20, A21