PHP按自定义顺序对工作日和月份-年份数组进行排序

Posted

技术标签:

【中文标题】PHP按自定义顺序对工作日和月份-年份数组进行排序【英文标题】:PHP sort weekday and month-year array by custom order 【发布时间】:2013-07-16 13:44:11 【问题描述】:

我有一系列工作日(见下文),我想将它们分类为“周一-周二-周三-周四-周五-周六-周日”。

"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 等),但是一旦我做对了,它应该是更容易。

非常感谢。

【问题讨论】:

【参考方案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 数组。

【讨论】:

太好了,它有效!我仍然不明白我做错了什么,但没关系。谢谢! 我认为原来的错误可以通过将return ($a > $b) ? -1 : 1;更改为return ($a < $b) ? -1 : 1;来解决【参考方案2】:

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

$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 表示一月。

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

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

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

【讨论】:

【参考方案3】:

接受有点晚了,但一个优点是这将适用于其他语言的日子,因为它使用 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;
);

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

【讨论】:

【参考方案4】:

此方法需要 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);

【讨论】:

以上是关于PHP按自定义顺序对工作日和月份-年份数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何按自定义顺序对 JavaScript 中的数组进行排序? [复制]

按自定义字典顺序对字符串进行排序

在 Eloquent 中按自定义顺序对集合进行排序 [重复]

python按自定义顺序排序字典列表[重复]

按自定义数组对行进行排序

PHP Wordpress:按自定义字段对特定类别排序