【问题标题】:PHP sort weekday and month-year array by custom orderPHP按自定义顺序对工作日和月份-年份数组进行排序
【发布时间】: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 等),但是一旦我做对了,它应该是更容易。

非常感谢。

【问题讨论】:

    标签: php arrays sorting compare


    【解决方案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);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-07-04
          • 1970-01-01
          • 2017-05-26
          • 1970-01-01
          • 1970-01-01
          • 2019-10-07
          • 1970-01-01
          相关资源
          最近更新 更多