Reputation: 925
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
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
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