2013-04-10 39 views
1

我有一个数组,其键的格式为[A1] - > [A20],[B1] - > [B20]等,我正在尝试首先使用ksort()(以正确的顺序获取字母)然后uksort()对数组进行排序。数组键由'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; 

} 

回答

4

你可以只使用strnatcmp功能,这将满足您的需求:

uksort($array, 'strnatcmp'); 

并通过@文件档案化管理的另一个解决方案M8R-1jmw5r

ksort($array, SORT_NATURAL);

+0

为什么不只是:'ksort($ array,SORT_NATURAL);'? – 2013-04-10 16:00:19

+0

完美,谢谢。我不知道你可以这样使用'uksort()',但现在我明白了,这很明显! – 2013-04-10 16:00:46

+0

@ M8R-1jmw5r是的,这也有效。 – xdazz 2013-04-10 16:03:53

1

documentation for usort

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

也就是说,而不是返回truefalse,你应该返回$num_a - $num_b(或做比较,并返回-11,或0

+0

谢谢你,你的解释更容易比一个在文档就明白了! – 2013-04-10 16:02:47

1

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

+0

谢谢,我不知道这个功能,它确实有效。然而@xdazz的回答消除了我使用自定义回调的需要,所以我会接受他的回答。 – 2013-04-10 16:02:10

+1

像往常一样,几乎总是有几种不同的方法来为猫皮!:) – Mark 2013-04-11 13:56:46

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 
+0

谢谢你的解释和例子,那的确是我所做的(但@xdazz在你之前到达那里)。 – 2013-04-10 16:04:03

+1

@DavidGard这就是生活。很高兴我能帮上忙。 – phpisuber01 2013-04-10 16:07:05

1

你想用你的按键排序数组中自然顺序

ksort($array, SORT_NATURAL); 

ksort()

自然排序顺序是:

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

谢谢,但不完全。它自然地对数字元素进行排序,但是按键的开始处的字母仍按原始顺序排列。 – 2013-04-10 16:06:58

+0

@DavidGard:然后你应该看到'strnatcmp()'的确切问题。解决方案然后是我在上面评论中链接的填充排序。 – 2013-04-10 16:07:43

+0

不,那一个工作正常。例如,如果原始顺序是'E5,E1,E10,A5,A1,A10','ksort($ array,SORT_NATURAL)'命令它'E1,E5,E10,A1,A5,A10',其中'uksort $ array,'strnatcmp')'命令它'A1,A5,A10,E1,E5,E10'。 – 2013-04-10 16:12:28