Jimmy
Jimmy

Reputation: 925

How do I sort a multi-dimensional array by time values in PHP?

I'm doing a school project and I have a multi-dimensional array having start_time and end_time of courses.

I already sorted the array by day, but I also want to sort the array by time. Such that the lowest start_time is the first element of the array.

This is how my array is at the moment:

Array ( 
       [0] => Array ( 
                     [courseID] => comp345
                     [lectureID] => ss
                     [day] => monday
                     [stime] => 18:20 
                     [etime] => 20:30 
                     [term] => winter 
                     [year] => 2014 
              )
       [1] => Array ( 
                     [courseID] => comp275 
                     [lectureID] => gg 
                     [day] => monday 
                     [stime] => 12:15 
                     [etime] => 15:16 
                     [term] => winter 
                     [year] => 2014
              )
)

I was wondering if there are any pre-defined functions to do that or if i need to create a new specific function for this task .

I can access the values of the start_time like this :

foreach ($array as $element)
{
  $start_time = (substr($element['stime'], 0, 5));
}

This will return the time in this format : 08:20

It works the same way as normal numbers when comparing such as :

08:20 < 10:15 = true

08:20 > 10:15 = false

Upvotes: 2

Views: 493

Answers (2)

AbraCadaver
AbraCadaver

Reputation: 78994

Get the stime items, convert them to a timestamp and sort, sorting the original array on that:

All versions:

array_multisort(array_map(function($v) {
                              return strtotime($v['stime']);
                          }, $array), SORT_ASC, $array);

PHP >= 5.5.0:

array_multisort(array_map('strtotime', array_column($array, 'stime')), SORT_ASC, $array);

Alternate:

foreach ($array as $k => $v) {
  $stime[$k] = strtotime($v['stime']);
}
array_multisort($stime, SORT_ASC, $array);

Upvotes: 5

Martin Thoma
Martin Thoma

Reputation: 136379

Add the unix timestamp with mktime to your array and sort by that timestamp. The unix timestamp is the number of second since 1970, so it is an integer and hence easy to sort.

Take a look at this reference question about sorting in PHP.

As you have

Array ( 
  [0] => Array ( [courseID] => comp345 [lectureID] => ss 
                 [day] => monday 
                 [stime] => 18:20 
                 [etime] => 20:30 
                 [term] => winter 
                 [year] => 2014 ) 
  [1] => Array ( [courseID] => comp275 [lectureID] => gg 
                 [day] => monday [stime] => 12:15 
                 [etime] => 15:16 [term] => winter 
                 [year] => 2014 ) )

Something like this should do it:

Go through array, add 'unixtimestamp' = mktime($el['hour'], $el['minute'], 0, 0, 0, $el['year'])

function sortByOrder($a, $b) {
    return $a['unixtimestamp'] - $b['unixtimestamp'];
}

usort($myArray, 'sortByOrder');

Upvotes: 0

Related Questions