按日期对数组进行排序,然后按时间排序 - PHP



我有一个预订系统,用于预订以下形式的数组:

array(6) {
[0]=> array(5) {
["date"]=> string(10) "08/12/2016"
["start"]=> string(5) "15:00"
["end"]=> string(5) "16:00"
["booked_by"]=> string(5) "mark"
["id"]=> string(1) "4"
}

我使用这个函数按日期排序,并在数组中获取所有预订:

function getBooking($aula) {
global $client;
$keys = $client->keys("Calendar:aula$aula:*");
$booking = array();
foreach ($keys as $key => $value) {
$result = $client->hGetAll($value);
array_push($booking, $result);
}
usort($booking, function($a1, $a2) {
$v1 = strtotime(str_replace("/", "-", $a1['data']));
$v2 = strtotime(str_replace("/", "-", $a2['data']));
return $v1 - $v2; // $v2 - $v1 to reverse direction
});
return $booking;
}

我还需要通过"开始"键对其进行排序以在日历中显示它们。我尝试添加另一个 usort,但它不起作用。如果您需要更多信息,请给我回信 提前感谢您的帮助

正如@Don't Panic所说,如果你可以作为数据库请求的一部分进行排序,那就去做吧。

否则,如果您按原样使用数组 - 您可以从date中提取数据并start字符串,将其按正确的顺序排列,然后在排序时使用strcmp()。例如

usort($booking, function($a, $b) {
// extract year, month and day from date
list($a_month, $a_day, $a_year) = explode('/', $a['date']);
list($b_month, $b_day, $b_year) = explode('/', $b['date']);
// compare the correctly ordered strings
return strcmp($a_year.$a_month.$a_day.$a['start'], $b_year.$b_month.$b_day.$b['start']);
});

如果某些代码不熟悉
,则提供一些参考strcmp()http://php.net/manual/en/function.strcmp.php
list()http://php.net/manual/en/function.list.php

@Steve解决方案很棒。但您也可以使用array_multisortarray_column

array_multisort(
array_map('strtotime', array_column($booking, 'date')),
array_column($booking, 'start'),
$booking
);

这是工作演示。

虽然在这种特殊情况下它不是最佳的,但当您需要按date升序排序,但按start降序或其他方式排序时,它可能更适合。

尽管如此,此类操作最好在数据库内完成。

编辑

正如@Don't Panic在评论中所说,由于格式的原因,按日期排序可能会很棘手。为了弥补这一点,我们可以array_map'date'strtotime.

最新更新