如何根据当前时间对多维数组进行排序?

时间:2019-02-11 10:47:20

标签: php arrays

  

我有一个像这样的数组

$arr = array(

        array(
            'id'=>'1',
            'time'=>'08:00'
            ),
        array(
            'id'=>'2',
            'time'=>'11:00'
            ),
        array(
            'id'=>'3',
            'time'=>'14:00'
            ),
        array(
            'id'=>'4',
            'time'=>'17:00'
            )
       );

我想要的是假设时间是11:30,我希望第三个数组(时间-> 14:00)位于数组的第一个位置,其余的位于数组的下面。我正在使用PHP 5.3(这是我可以使用该技术的全部能力)。

  

输出应为:

array(
      array(
            'id'=>'1',
            'time'=>'14:00'
            ),
       array(
            'id'=>'2',
            'time'=>'17:00'
            )
        array(
            'id'=>'3',
            'time'=>'08:00'
            ),
        array(
            'id'=>'4',
            'time'=>'11:00'
            )
);

3 个答案:

答案 0 :(得分:3)

您可以将此回调用于usort

$t = date("h:m") . "_"; // add a character so it cannot be EQUAL to any time in the input
usort($arr, function ($a, $b) use ($t) {
    return strcmp($a["time"],$b["time"]) * strcmp($t,$a["time"]) * strcmp($t,$b["time"]);
});

说明

首先,以HH:MM格式检索当前时间。将一个字符附加到该字符后,以确保输入数组中的所有时间字符串都不与该字符完全匹配。这将确保以当前时间作为参数,并以输入日期作为其他参数的调用strcmp永远不会返回0,而是-1或1。请注意-1表示第一个参数小于第二个论点。 1表示相反。

传递给usort的回调将被几对输入时间字符串调用,并且应返回一个负值或正值(或0)以指示该对在输出中的排序方式:negative表示第一个值应该在第二个之前,0表示它们是相同的并且可以以任何方式进行排序,而1表示第二个应该在第一个之前进行排序。

这里的返回值是三个值的乘积,每个值都是strcmp的结果。第二和第三永远不能为零。

当第二个和第三个值相等(均为1或均为-1)时,表示两个输入时间在当前时间的同一侧:既在当前时间之前,又在当前时间之后。那么这两个因素的乘积就是1。

如果这些值不相等(一个为1,另一个为-1),则意味着两个输入时间位于当前时间的不同侧,因此它们的顺序应相反。乘积就是-1。

最后,第一个因素告诉我们两个输入值如何相互比较。当上面提到的乘积为-1时,这应该颠倒过来,实际上乘会解决这个问题。

答案 1 :(得分:2)

为此使用usort

usort($array, function ($a, $b) {
   $aTime = strtotime(date('Y-m-d ' . $a['time']));
   $bTime = strtotime(date('Y-m-d ' . $b['time']));
   $time = strtotime(date('Y-m-d 13:00'));

   if ($aTime > $time && $bTime < $time)
       return -1; // $a is in future, while $b is in past
   elseif ($aTime < $time && $bTime > $time)
       return 1; // $a is in past, while $b is in future
   else
       return $aTime - $bTime; // $a and $b is either in future or in past, sort it normally.
});

Live example

答案 2 :(得分:1)

在PHP 7中

usort($arr, function($a, $b)
{
  $t = time();
  $a = $t < ($a = strtotime($a['time'])) ? $a : $a + 86400; // +1 day
  $b = $t < ($b = strtotime($b['time'])) ? $b : $b + 86400;
  return $a <=> $b;
});