我有一个像这样的数组
$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'
)
);
答案 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.
});
答案 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;
});