phparrayssortingfilenamesnatural-sort

How to naturally sort an array of filenames?


I have an array that I wish to sort, it contains images with file extensions, the filename is numeric and the file extension is obviously a string.

$files = array();
$files[] = '4.jpg';
$files[] = '14.jpg';
$files[] = '1.jpg';
$files[] = '44.jpg';

If I use sort(), then I end up with the following:

sort($files);
print_r($files);

Array
(
    [0] => 1.jpg
    [1] => 14.jpg
    [2] => 4.jpg
    [3] => 44.jpg
)

What I actually want is:

Array
(
    [0] => 1.jpg
    [1] => 4.jpg
    [2] => 14.jpg
    [3] => 44.jpg
)

Solution

  • The quickest an easiest way of doing this is with natsort() - http://php.net/manual/en/function.natsort.php

    e.g:

    natsort($files);
    print_r($files);
    

    Output:

    Array
    (
        [2] => 1.jpg
        [0] => 4.jpg
        [1] => 14.jpg
        [3] => 44.jpg
    )
    

    This function implements a sort algorithm that orders alphanumeric strings in the way a human being would while maintaining key/value associations. This is described as a "natural ordering".

    you can also use sort_flags option in the sort() function

    sort($files, SORT_NUMERIC);
    print_r($files);
    
    Array
    (
        [0] => 1.jpg
        [1] => 4.jpg
        [2] => 14.jpg
        [3] => 44.jpg
    )
    

    The optional second parameter sort_flags may be used to modify the sorting behavior using these values:

    Sorting type flags:

    SORT_REGULAR - compare items normally (don't change types)

    SORT_NUMERIC - compare items numerically

    SORT_STRING - compare items as strings

    SORT_LOCALE_STRING - compare items as strings, based on the current locale. Added in PHP 4.4.0 and 5.0.2, it uses the system locale, which can be changed using setlocale().