2014-01-28 90 views
1

我有一個使用DirectoryIterator獲得的文件名數組。我試圖讓文件名進行排序,以便它們按照順序排列,這就是它們在服務器上的顯示方式。 php用下劃線排序文件名

 
    2DAYSALEGATE_PG1.jpg 
    2DAYSALEGATE_PG2.jpg 
    722_PG1.jpg 
    PW_PG2_COKE_A.jpg 
    PW_PG3_COKE_A.jpg 
    PWBY4_DELI-1.jpg 

當獲得文件名時,它們會像這樣出現。我試圖用sort,natsort和natcasesort。字母后面的下劃線字符的文件名被考慮。我能做些什麼來獲得下劃線作爲優先級字符排序。

array(6) { 
[0]=> 
string(20) "2DAYSALEGATE_PG1.jpg" 
[1]=> 
string(20) "2DAYSALEGATE_PG2.jpg" 
[2]=> 
string(11) "722_PG1.jpg" 
[5]=> 
string(16) "PWBY4_DELI-1.jpg" 
[3]=> 
string(17) "PW_PG2_COKE_A.jpg" 
[4]=> 
string(17) "PW_PG3_COKE_A.jpg" 
} 

感謝

+0

您是否在使用排序時設置了sort_flags參數? –

+0

是的,我什麼都試過 – Harpua

回答

5

您可以使用PHP usort方法,檢查出來hereusort可以實現您的自定義功能compare to,並根據它的數組進行排序。

定製compare to功能int callback (mixed $a, mixed $b),你應該返回小於0,如果$a < $b,零,如果相等的值,大於0的值時$a > $b

使用這種方法

實現排序的最喜歡的順序例如:

function cmp($a, $b) { 
    $aTemp = str_replace('_', '0', $a); 
    $bTemp = str_replace('_', '0', $b);  
    return strcmp($aTemp,$bTemp); 
} 

usort($arr, "cmp"); 
+0

原來這就是我想出了 功能CMP($ A,$ B){ \t $ aTemp = str_replace函數( '_',0,$ A); \t $ bTemp = str_replace('_',0,$ b); \t if($ aTemp == $ bTemp){ \t \t return 0; \t} \t \t return($ aTemp <$ bTemp)? -1:1; } usort($ arr,「cmp」); – Harpua

+0

對不起,我不知道如何獲得此代碼格式正確顯示在這裏。 – Harpua

+0

no no,而不是==和<,只是使用'return strcmp($ aTemp,$ bTemp)',它的自然字符串比較函數 – Dima

1

不知道你可以在這裏做什麼。詞法上,下劃線的ASCII值高於任何字母數字字符。

用\ x01等低ASCII值替換下劃線,然後進行排序,然後用下劃線替換低的ASCII值,會得到您想要的結果,但對於次序更改而言,這似乎相當昂貴。

0

嘗試使用

for(i=0;i<array(6).length;i++){ 
if (array(6).charAt(0)=='_'){ 
for (int i = 0; i < n; i++) 
{ 
for (int j = i + 1; j < n; j++) 
{ 
if (a[i] > a[j]) 
{ 
temp = a[i]; 
a[i] = a[j]; 
a[j] = temp; 
}}}}}