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