在PHP中对工作日时间组合数组进行排序

时间:2014-04-09 20:05:15

标签: php arrays sorting

我有一个表格中的数组:

    $sortme = array(
        'Monday 10:00',
        'Friday 12:00',
        'Tuesday 14:00',
        'Monday 08:00',
        'Wednesday 11:00',
    );

元素的数量是未知的(因此我不能将uksort方法与参考数组一起用于工作日as Mark suggested here的顺序)。我希望结果按时间顺序排序,并始终从星期一开始,如下所示:

    $sorted = array(
        'Monday 08:00',
        'Monday 10:00',
        'Tuesday 14:00',
        'Wednesday 11:00',
        'Friday 12:00',
    );

有没有一种优雅的方法来实现它而不需要将数组转换为二维数并迭代?到目前为止,这是我唯一的想法。

4 个答案:

答案 0 :(得分:1)

您可以在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);

答案 1 :(得分:1)

我正在尝试使用array_multisortarray_mapcall_user_func_array的单行,但我的大脑已经被炒了。试试这个:

foreach($sortme as $val) {
    $sorter[] = date('N H:i', strtotime($val));
}
array_multisort($sorter, SORT_ASC, $sortme);

编辑:One-long-liner:

array_multisort(array_map(function($v){return date('N H:i',strtotime($v));}, $sortme), SORT_ASC, $sortme);

DEMO

array_multisort(
                array_map(
                          function($v){
                              return date('N H:i',strtotime($v));
                          }, 
                            $sortme),
                                     SORT_ASC, $sortme);

答案 2 :(得分:0)

$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);

答案 3 :(得分:0)

您只需将数组项转换为 可排序的内容:

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;
}