【问题标题】:How do I sort a multi-dimensional array by time values in PHP?如何在 PHP 中按时间值对多维数组进行排序?
【发布时间】:2014-05-18 23:39:16
【问题描述】:

我正在做一个学校项目,我有一个包含 start_timeend_time 课程的多维数组。

我已经按天对数组进行了排序,但我还想按时间对数组进行排序。这样最低的 start_time 是数组的第一个元素。

这就是我的数组现在的样子:

Array ( 
       [0] => Array ( 
                     [courseID] => comp345
                     [lectureID] => ss
                     [day] => monday
                     [stime] => 18:20 
                     [etime] => 20:30 
                     [term] => winter 
                     [year] => 2014 
              )
       [1] => Array ( 
                     [courseID] => comp275 
                     [lectureID] => gg 
                     [day] => monday 
                     [stime] => 12:15 
                     [etime] => 15:16 
                     [term] => winter 
                     [year] => 2014
              )
)

我想知道是否有任何预定义的函数可以做到这一点,或者我是否需要为此任务创建一个新的特定函数。

我可以像这样访问 start_time 的值:

foreach ($array as $element)
{
  $start_time = (substr($element['stime'], 0, 5));
}

这将以这种格式返回时间:08:20

比较时它的工作方式与普通数字相同,例如:

08:20

08:20 > 10:15 = 假

【问题讨论】:

    标签: php arrays sorting


    【解决方案1】:

    获取stime 项目,将它们转换为时间戳并排序,然后对原始数组进行排序:

    所有版本

    array_multisort(array_map(function($v) {
                                  return strtotime($v['stime']);
                              }, $array), SORT_ASC, $array);
    

    PHP >= 5.5.0

    array_multisort(array_map('strtotime', array_column($array, 'stime')), SORT_ASC, $array);
    

    替代

    foreach ($array as $k => $v) {
      $stime[$k] = strtotime($v['stime']);
    }
    array_multisort($stime, SORT_ASC, $array);
    

    【讨论】:

    • array_multisort(array_map('strtotime', array_column($MondayArray, 'stime')), SORT_ASC, $MondayArray); - 工作 - 非常感谢,我会在 5 分钟后接受答复
    【解决方案2】:

    将带有mktime 的unix 时间戳添加到您的数组并按该时间戳排序。 unix 时间戳是自 1970 年以来的秒数,因此它是一个整数,因此易于排序。

    看看这个reference question about sorting in PHP

    如你所愿

    Array ( 
      [0] => Array ( [courseID] => comp345 [lectureID] => ss 
                     [day] => monday 
                     [stime] => 18:20 
                     [etime] => 20:30 
                     [term] => winter 
                     [year] => 2014 ) 
      [1] => Array ( [courseID] => comp275 [lectureID] => gg 
                     [day] => monday [stime] => 12:15 
                     [etime] => 15:16 [term] => winter 
                     [year] => 2014 ) )
    

    应该这样做:

    Go through array, add 'unixtimestamp' = mktime($el['hour'], $el['minute'], 0, 0, 0, $el['year'])
    
    function sortByOrder($a, $b) {
        return $a['unixtimestamp'] - $b['unixtimestamp'];
    }
    
    usort($myArray, 'sortByOrder');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-11
      相关资源
      最近更新 更多