1

我有一系列工作日(见下文),我想将它们分类为“Mon-Tue-Wed-Thu-Fri-Sat-Sun”。

"Sun"=>59
"Sat"=>41
"Fri"=>21
"Thu"=>11
"Wed"=>14
"Tue"=>19
"Mon"=>31

我尝试了以下代码,但它似乎无法正常工作,结果是上面粘贴的有序数组,即不是我希望的顺序。

function orderbyweekday($a, $b) {

    if (strcmp($a, "Mon") == 0) 
        $a = 0;
    else if (strcmp($a, "Tue") == 0) 
        $a = 1;    
    else if (strcmp($a, "Wed") == 0) 
        $a = 2;
    else if (strcmp($a, "Thu") == 0) 
        $a = 3; 
    else if (strcmp($a, "Fri") == 0) 
        $a = 4;
    else if (strcmp($a, "Sat") == 0)  
        $a = 5;
    else if (strcmp($a, "Sun") == 0)   
        $a = 6;    

    if (strcmp($b, "Mon") == 0) 
        $b = 0;
    else if (strcmp($b, "Tue") == 0) 
        $b = 1;    
    else if (strcmp($b, "Wed") == 0) 
        $b = 2;
    else if (strcmp($b, "Thu") == 0) 
        $b = 3; 
    else if (strcmp($b, "Fri") == 0) 
        $b = 4;
    else if (strcmp($b, "Sat") == 0)  
        $b = 5;
    else if (strcmp($b, "Sun") == 0)   
        $b = 6;    

    // if same day, return 0
    if ($a == $b) {
        return 0;
    } 

    return ($a > $b) ? -1 : 1;
}

uksort($movies_per_day, "orderbyweekday");

我也想对一系列月份年份做类似的事情(例如“2010 年 6 月”=>10、“2009 年 5 月”=>111 等),但是一旦我做对了,它应该会更容易。

非常感谢。

4

4 回答 4

1

你可以试试这个。

function weekdaySort($a, $b){
      $weekdays = array("Mon", "Tue","Wed","Thu","Fri", "Sat", "Sun");
      return array_search($a, $weekdays) - array_search($b, $weekdays);
} 

uksort($movies_per_day, "weekdaySort");

或者如果您使用的是 php 5.3 或更高版本,您可以使用闭包;

$weekdays = array("Mon", "Tue","Wed","Thu","Fri", "Sat", "Sun");
uksort($movies_per_day, function($a, $b) use ($weekdays) {return array_search($a, $weekdays) - array_search($b, $weekdays);});

这将避免在$weekdays每次迭代时重新创建数组。

于 2013-07-16T13:49:18.407 回答
0

我建议将数组键更改为更计算机可读(和可排序)的东西,所以使用数字作为键:

$days = array(6=>59,5=>41,4=>21,3=>11,2=>14,1=>19,0=>31);

然后,您可以按以下方式对日期进行排序:

ksort($days);

至少对于像“2010 年 6 月”这样的困难键,几乎不可能对数组进行排序。您可以使用诸如$key = year*12+month;具有可排序索引的键。“2010 年 6 月”可以写为 24125 (2010*12+5),如果您使用 0 表示 1 月。

或者使用一个月的第一天的时间戳:

$key = mktime(0,0,0,6,1,2010);

如果您想在某天获得每日报告,这将更加灵活。

于 2013-07-16T14:05:28.770 回答
0

接受有点晚了,但一个优点是这将适用于其他语言的日子,因为它使用 PHP 的日期/时间处理

$days = array(
    "Sun"=>59,
    "Sat"=>41,
    "Fri"=>21,
    "Thu"=>11,
    "Wed"=>14,
    "Tue"=>19,
    "Mon"=>31,
);
uksort($days, function($a, $b) {

    $c = date_diff(new DateTime('@' . strtotime($a, strtotime('Mon', 0))), new DateTime('@' . strtotime($b, strtotime('Mon', 0))));

    return $c->invert ? 1 : -1;
});

对于这样一个简单的任务,它似乎不必要地复杂,我相信有更好的方法!

于 2013-07-16T14:10:54.057 回答
0

此方法需要 PHP > 5.3:

$arr = array("Sun"=>59, "Thu"=>11, "Sat"=>41, "Fri"=>21, "Tue"=>19, "Wed"=>14, "Mon"=>31);
$ord = array_flip(array('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'));
uksort($arr, function ($a, $b) use($ord){
    return $ord[$a] - $ord[$b];
});
var_dump($arr);
于 2013-07-16T14:16:25.473 回答