Search code examples
phparrayssortingmultidimensional-array

Sort array of arrays by date field


I am looking for the best way to sort a multidimensional array, I want it sorted based on what the child array contains.

This is my array:

Array
(
    [0] => Array
        (
            [id] => 2
            [level] => 3
            [lastAction] => "String Here" 
            [actionAt] => 23/03/2014
        )

    [1] => Array
        (
            [id] => 4
            [level] => 5
            [lastAction] => "Another String here"
            [actionAt] => 24/3/2014
        )

    [2] => Array
        (
            [id] => 9
            [level] => 1
            [lastAction] => "String again"
            [actionAt] => 01/01/2013
        )

)

And I would like to sort the 3 main arrays based on the ActionAt from their child arrays, how is this possible?

I've read a bit about it and some say ksort and usort, but I have not been able to get it working properly.


Solution

  • You will need to implement your own comparison function and use usort:

    function cmp($a, $b)
    {
        if ($a['actionAt'] == $b['actionAt']) {
            return 0;
        }
    
        //Assuming your dates are strings (http://stackoverflow.com/questions/2891937/strtotime-doesnt-work-with-dd-mm-yyyy-format)
        $atime = strtotime(str_replace('/', '-', $a['actionAt']));
        $btime = strtotime(str_replace('/', '-', $b['actionAt']));
    
        return ($atime < $btime) ? -1 : 1;
    }
    
    usort($array, "cmp");