我有一个形式为的数组
$sortme = array(
'Monday 10:00',
'Friday 12:00',
'Tuesday 14:00',
'Monday 08:00',
'Wednesday 11:00',
);
元素的数量是未知的(所以我不能像Mark在这里建议的那样,将uksort方法与引用数组一起用于工作日的顺序)。我希望结果按时间顺序排序,总是从周一开始,如下所示:
$sorted = array(
'Monday 08:00',
'Monday 10:00',
'Tuesday 14:00',
'Wednesday 11:00',
'Friday 12:00',
);
有没有一种优雅的方法可以做到这一点,而不需要将数组转换为二维数组并进行迭代?到目前为止,这将是我唯一的想法。
您可以在PHP中使用usort
函数,它将使用用户指定的比较函数进行排序。下面的代码可能不是最有效的,但它会产生正确的结果。
$sortme = array(
'Monday 10:00',
'Friday 12:00',
'Tuesday 14:00',
'Monday 08:00',
'Wednesday 11:00',
);
usort($sortme, function($a, $b) { return strcmp(date('N H:i', strtotime($a)), date('N H:i', strtotime($b))); });
print_r($sortme);
我试着用array_multisort
、array_map
或call_user_func_array
做一个内衬,但我的大脑被炸了。试试这个:
foreach($sortme as $val) {
$sorter[] = date('N H:i', strtotime($val));
}
array_multisort($sorter, SORT_ASC, $sortme);
编辑:一条长划线:
array_multisort(array_map(function($v){return date('N H:i',strtotime($v));}, $sortme), SORT_ASC, $sortme);
演示
array_multisort(
array_map(
function($v){
return date('N H:i',strtotime($v));
},
$sortme),
SORT_ASC, $sortme);
$sortme = array(
'Monday 10:00',
'Friday 12:00',
'Tuesday 14:00',
'Monday 08:00',
'Wednesday 11:00',
);
$sorted = array();
// Add the day of week in the begining of the string
for($i = 0; $i < count($sortme); $i++){
$day = explode(' ', $sortme[$i]);
@$dayNumber = date('w', strtotime($day[0]));
array_push($sorted, $dayNumber . $day[0] . ' '. $day[1]);
}
// Sort the array
asort($sorted);
// Remove the day of week
for($i = 0; $i < count($sorted); $i++){
$sorted[$i] = substr($sorted[$i], 1);
}
var_dump($sorted);
您只需要将数组项转换为可排序的东西:
function sortTimes(array $dates) {
$base = strtotime('next monday 00:00');
usort($dates, function($a, $b) use ($base) {
return strtotime($a, $base) - strtotime($b, $base);
});
return $dates;
}