2

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

Martin Thoma
  • 91,837
  • 114
  • 489
  • 768
Jimmy
  • 755
  • 2
  • 11
  • 34

2 Answers2

3

PHP >= 5.5.0:

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

PHP < 5.5.0:

foreach ($array as $k => $v) {
  $stime[$k] = strtotime($v['stime']);
}
array_multisort($stime, SORT_ASC, $array);
AbraCadaver
  • 73,820
  • 7
  • 55
  • 81
  • array_multisort(array_map('strtotime', array_column($MondayArray, 'stime')), SORT_ASC, $MondayArray); - Works - Thanks a lot , I'll accept answer after 5 mins – Jimmy Apr 06 '14 at 21:51
0

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');
Community
  • 1
  • 1
Martin Thoma
  • 91,837
  • 114
  • 489
  • 768