php使用下划线排序文件名

时间:2014-01-28 21:03:06

标签: php arrays sorting

我有一个使用DirectoryIterator获取的文件名数组。我试图让文件名进行排序,以便它们按顺序排列,这就是它们在服务器上的显示方式。     

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

由于

4 个答案:

答案 0 :(得分:6)

您可以使用php usort方法,查看here 使用usort,您可以实现自定义compare to函数并根据它对数组进行排序。

自定义compare to函数为int callback ( mixed $a, mixed $b ),如果$a < $b,则应返回小于0的值,如果相等则返回0,如果$a > $b则返回大于0的值

使用此方法实现您首选的排序顺序

示例:

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

 usort($arr, "cmp");

答案 1 :(得分:2)

不确定你能在这做什么。从字面上看,下划线的ASCII值高于任何字母数字字符。

用\ x01之类的低ASCII值替换下划线,然后排序,然后用下划线替换低ASCII值,将得到你想要的结果,但这对于按顺序改变来说似乎相当昂贵。

答案 2 :(得分: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;
}}}}}

答案 3 :(得分:0)

一个简单的技巧是:

        // Fix sorting issues with Upper Case and underscore
        $arr = array_change_key_case($arr, CASE_LOWER);
        // sort keys alphabetically:
        ksort($arr);
        // Put them back to UPPER
        $arr = array_change_key_case($arr, CASE_UPPER);

排序时大写下划线权重较小,会在后面。