3
votes

I have an array of filenames that I aquire using DirectoryIterator. I am trying to get the filenames to sort so they would be in order like so, this is the way they appear on the server.

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

When aquiring the file names they are coming out like this. I have tried to use a sort, natsort and natcasesort. The filename the underscore character is considered after the letters. What can I do to get the underscore to sorted as a priority character.

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

Thanks

4
Did you set the sort_flags parameter when you used sort? - Paul Facklam
yes I tried everything - Harpua

4 Answers

7
votes

You can use the php usort method, check it out here with usort you can implement your custom compare to function and sort the array according to it.

the custom compare to function is int callback ( mixed $a, mixed $b ) , you should return a value less than 0 if $a < $b , zero if equal and a value bigger than 0 when $a > $b

implement your preferred order of sorting using this method

example:

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

 usort($arr, "cmp");
3
votes

Not sure what you can do here. Lexically, the underscore has a higher ASCII value than any alphanumeric character.

Replacing the underscore with a low ASCII value like \x01, then sorting, then replacing the low ASCII value with an underscore, will give the result you want, but that seems pretty expensive for a trivial change in order.

0
votes

try using

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;
}}}}}
0
votes

A simple trick for this is:

// 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);

When sorting Uppercase underscore has less weight and will go after.