【问题标题】:PHP Order array by multiple elements - Date and Time based sortingPHP Order array by multiple elements - 基于日期和时间的排序
【发布时间】:2020-03-09 02:00:56
【问题描述】:

我有一个数组如下:

$array = array (
    array(  'Day' => 'Monday',
            'Start' => '0830',
            'End' => '1730'),

    array(  'Day' => 'Monday',
            'Start' =>'1730',
            'End' => '2130'),

    array(  'Day' => 'Tuesday',
            'Start' => '0600',
            'End' => '1100'),

    array(  'Day' => 'Tuesday',
            'Start' => '0600',
            'End' => '0900'),           
);

我正在研究如何对其进行排序,以便结果首先按 Day 排序,然后按最早的 Start 排序,然后是 End。

使用上面的数组,结果是:

Monday 0830-1730
Monday 1730-2130

Tuesday 0600-0900
Tuesday 0600-1100

任何人都可以建议最好的方法来做到这一点。 谢谢

【问题讨论】:

    标签: php sorting date multidimensional-array


    【解决方案1】:

    最好的方法是使用 uasort (https://www.php.net/manual/function.uasort.php),它允许您实现自定义比较功能。

    【讨论】:

      【解决方案2】:

      所以,正如@Daniel 所写,只需使用usort 函数 您还需要检查您希望如何将 Day 表示为 int - 检查 date 功能手册 - 在我的解决方案中使用 N 格式,所以星期一 - 1 ...星期日 - 7 排序逻辑只是一个https://en.wikipedia.org/wiki/Polynomial

      <?php
      
      $array = array (
          array(  'Day' => 'Monday',
                  'Start' => '0830',
                  'End' => '1730'),
      
          array(  'Day' => 'Monday',
                  'Start' =>'1730',
                  'End' => '2130'),
      
          array(  'Day' => 'Tuesday',
                  'Start' => '0600',
                  'End' => '1100'),
      
          array(  'Day' => 'Tuesday',
                  'Start' => '0600',
                  'End' => '0900'),           
      );
      
      usort($array, function($a, $b) {
          return (date("N", strtotime($a['Day'])) <=> date("N", strtotime($b['Day']))) * 100 +
                 ($a['Start'] <=> $b['Start']) * 10 +
                 ($a['End'] <=> $b['End']);
      });
      
      var_dump($array);
      

      demo

      【讨论】:

      • 谢谢 - 这似乎正是我所需要的。感谢您提供 date 和 usort 的链接。
      • 不客气,伙计! SO就是这样工作的^_^和平!
      【解决方案3】:

      您可以对 spaceship operator 使用 usort,将可比较的键按优先顺序放置在数组中:

      一个翻转数组用于获取工作日的数值 0-4。

      <?php
      
      $array = array (
          array(  'Day' => 'Monday',
                  'Start' => '0830',
                  'End' => '1730'),
      
          array(  'Day' => 'Monday',
                  'Start' =>'1730',
                  'End' => '2130'),
      
          array(  'Day' => 'Tuesday',
                  'Start' => '0600',
                  'End' => '1100'),
      
          array(  'Day' => 'Tuesday',
                  'Start' => '0600',
                  'End' => '0900'),           
      );
      
      usort($array, function($a, $b) {
          $dotw = array_flip(['Monday', 'Tuesday', 'Wednesday', 'Thursday','Friday']);
          return
              [$dotw[$a['Day']], $a['Start'], $a['End']]
              <=>
              [$dotw[$b['Day']], $b['Start'], $b['End']];
      });
      var_export($array);
      

      输出:

      array (
          0 => 
          array (
          'Day' => 'Monday',
          'Start' => '0830',
          'End' => '1730',
          ),
          1 => 
          array (
          'Day' => 'Monday',
          'Start' => '1730',
          'End' => '2130',
          ),
          2 => 
          array (
          'Day' => 'Tuesday',
          'Start' => '0600',
          'End' => '0900',
          ),
          3 => 
          array (
          'Day' => 'Tuesday',
          'Start' => '0600',
          'End' => '1100',
          ),
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-13
        • 2012-08-16
        • 2023-04-04
        • 2023-02-21
        • 1970-01-01
        • 2019-11-20
        • 1970-01-01
        • 2011-04-06
        相关资源
        最近更新 更多