0

I would like to sort an array in ascending order based on filename, which is a number. This is provng problematic. You will notice that the sorting is going by the first digit of the file name. Is there a pre built php function to deal with this?

sort(), ksort() give the same outcome as below

Array
(
    [0] => /myPath/folderFoo/1.jpg
    [1] => /myPath/folderFoo/11.jpg
    [2] => /myPath/folderFoo/12.jpg
    [3] => /myPath/folderFoo/13.jpg
    [4] => /myPath/folderFoo/14.jpg
    [5] => /myPath/folderFoo/15.jpg
    [6] => /myPath/folderFoo/16.jpg
    [7] => /myPath/folderFoo/17.jpg
    [8] => /myPath/folderFoo/18.jpg
    [9] => /myPath/folderFoo/199.jpg
    [10] => /myPath/folderFoo/2.jpg
    [11] => /myPath/folderFoo/3.jpg
    [12] => /myPath/folderFoo/4.jpg
    [13] => /myPath/folderFoo/5.jpg
    [14] => /myPath/folderFoo/6.jpg
    [15] => /myPath/folderFoo/7.jpg
    [16] => /myPath/folderFoo/8.jpg
    [17] => /myPath/folderFoo/9.jpg
)
  • why don't you try giving name in two digits ? (01,02,03) – Vigikaran Mar 09 '16 at 17:23
  • 7
    Either [natsort()](http://www.php.net/manual/en/function.natsort.php) or use the `SORT_NATURAL` flag with [sort()](http://www.php.net/manual/en/function.sort.php).... learn to use the PHP Docs, and they will be your bestest ever friend for life – Mark Baker Mar 09 '16 at 17:24
  • In fact that PHP manual for natsort lists your example as a use case for it. – Hanky Panky Mar 09 '16 at 17:28
  • @MarkBaker dually noted - thanks, marked as correct. –  Mar 09 '16 at 17:44

2 Answers2

1

As Mark Baker suggested, you can use anyone of these:- natsort()OR sort() with SORT_NATURAL flag

<?php
$data = Array
(
    '0' => '/myPath/folderFoo/1.jpg',
    '1' => '/myPath/folderFoo/11.jpg',
    '2' => '/myPath/folderFoo/12.jpg',
    '3' => '/myPath/folderFoo/13.jpg',
    '4' => '/myPath/folderFoo/14.jpg',
    '5' => '/myPath/folderFoo/15.jpg',
    '6' => '/myPath/folderFoo/16.jpg',
    '7' => '/myPath/folderFoo/17.jpg',
    '8' => '/myPath/folderFoo/18.jpg',
    '9' => '/myPath/folderFoo/199.jpg',
    '10' => '/myPath/folderFoo/2.jpg',
    '11' => '/myPath/folderFoo/3.jpg',
    '12' => '/myPath/folderFoo/4.jpg',
    '13' => '/myPath/folderFoo/5.jpg',
    '14' => '/myPath/folderFoo/6.jpg',
    '15' => '/myPath/folderFoo/7.jpg',
    '16' => '/myPath/folderFoo/8.jpg',
    '17' => '/myPath/folderFoo/9.jpg'
);
natsort($data);
echo "<pre/>";print_r($data);
$data1 = Array
(
    '0' => '/myPath/folderFoo/1.jpg',
    '1' => '/myPath/folderFoo/11.jpg',
    '2' => '/myPath/folderFoo/12.jpg',
    '3' => '/myPath/folderFoo/13.jpg',
    '4' => '/myPath/folderFoo/14.jpg',
    '5' => '/myPath/folderFoo/15.jpg',
    '6' => '/myPath/folderFoo/16.jpg',
    '7' => '/myPath/folderFoo/17.jpg',
    '8' => '/myPath/folderFoo/18.jpg',
    '9' => '/myPath/folderFoo/199.jpg',
    '10' => '/myPath/folderFoo/2.jpg',
    '11' => '/myPath/folderFoo/3.jpg',
    '12' => '/myPath/folderFoo/4.jpg',
    '13' => '/myPath/folderFoo/5.jpg',
    '14' => '/myPath/folderFoo/6.jpg',
    '15' => '/myPath/folderFoo/7.jpg',
    '16' => '/myPath/folderFoo/8.jpg',
    '17' => '/myPath/folderFoo/9.jpg'
);
sort($data1,SORT_NATURAL);
echo "<pre/>";print_r($data1);
?>

Output:- https://eval.in/533491

For reference:-

http://www.php.net/manual/en/function.natsort.php

http://www.php.net/manual/en/function.sort.php

Alive to die - Anant
  • 70,531
  • 10
  • 51
  • 98
  • Thanks - Just noticed this in the comments. I was searching through the sorting functions. Not sure how I missed it. –  Mar 09 '16 at 17:43
0

Without changing your array, you can also try this.

$arr = array("/myPath/folderFoo/1.jpg",
    "/myPath/folderFoo/11.jpg",
    "/myPath/folderFoo/12.jpg",
    "/myPath/folderFoo/13.jpg",
    "/myPath/folderFoo/14.jpg",
    "/myPath/folderFoo/15.jpg",
    "/myPath/folderFoo/16.jpg",
    "/myPath/folderFoo/17.jpg",
    "/myPath/folderFoo/18.jpg",
    "/myPath/folderFoo/199.jpg",
    "/myPath/folderFoo/2.jpg",
    "/myPath/folderFoo/3.jpg",
    "/myPath/folderFoo/4.jpg",
    "/myPath/folderFoo/5.jpg",
    "/myPath/folderFoo/6.jpg",
    "/myPath/folderFoo/7.jpg",
    "/myPath/folderFoo/8.jpg",
    "/myPath/folderFoo/9.jpg"
);
echo '<pre>';
for($i = 0; $i < count($arr); $i++){
  $int = filter_var($arr[$i], FILTER_SANITIZE_NUMBER_INT);
  $out[$int] = $arr[$i];
}
natsort($out);
print_r($out);
echo '</pre>';

Output:

    Array
(
    [1] => /myPath/folderFoo/1.jpg
    [2] => /myPath/folderFoo/2.jpg
    [3] => /myPath/folderFoo/3.jpg
    [4] => /myPath/folderFoo/4.jpg
    [5] => /myPath/folderFoo/5.jpg
    [6] => /myPath/folderFoo/6.jpg
    [7] => /myPath/folderFoo/7.jpg
    [8] => /myPath/folderFoo/8.jpg
    [9] => /myPath/folderFoo/9.jpg
    [11] => /myPath/folderFoo/11.jpg
    [12] => /myPath/folderFoo/12.jpg
    [13] => /myPath/folderFoo/13.jpg
    [14] => /myPath/folderFoo/14.jpg
    [15] => /myPath/folderFoo/15.jpg
    [16] => /myPath/folderFoo/16.jpg
    [17] => /myPath/folderFoo/17.jpg
    [18] => /myPath/folderFoo/18.jpg
    [199] => /myPath/folderFoo/199.jpg
)
Murad Hasan
  • 9,565
  • 2
  • 21
  • 42