【问题标题】:How to sort an array of times chronologically?如何按时间顺序对时间数组进行排序?
【发布时间】:2011-09-20 13:43:42
【问题描述】:

我有一个非关联数组,其中传入的数据未排序(我从外部系统接收数据,无法强制它按排序顺序进入数组。)有什么方法可以排序价值?我试过这个:

$wedTrackTimes = array("9:30 AM-10:30 AM", "8:15 AM-9:15 AM", "12:30 PM-1:30 PM", "2:00 PM-3:00 PM", "3:30 PM-4:30 PM");
$wedTrackTimes = array_unique($wedTrackTimes);
$wedTrackTimes = sort($wedTrackTimes);
print_r($wedTrackTimes);

但它不是返回排序数组,而是返回 1。我假设这是因为它是非关联的,所以没有键。有没有办法仅按值对数组进行排序?我们确实需要将上午 9:30 的时间段放在上午 8:15 的时间段之后,这是应该的。

更新

感谢大家的回答;这确实使数组排序,但不像预期的那样。如果我使用默认排序类型,我会得到:

Array
(
    [0] => 12:30 PM-1:30 PM
    [1] => 2:00 PM-3:00 PM
    [2] => 3:30 PM-4:30 PM
    [3] => 8:15 AM-9:15 AM
    [4] => 9:30 AM-10:30 AM
)

使用 SORT_NUMERIC 我得到了这个:

Array
(
    [0] => 2:00 PM-3:00 PM
    [1] => 3:30 PM-4:30 PM
    [2] => 8:15 AM-9:15 AM
    [3] => 9:30 AM-10:30 AM
    [4] => 12:30 PM-1:30 PM
)

使用 SORT_STRING 我得到了这个:

Array
(
    [0] => 12:30 PM-1:30 PM
    [1] => 2:00 PM-3:00 PM
    [2] => 3:30 PM-4:30 PM
    [3] => 8:15 AM-9:15 AM
    [4] => 9:30 AM-10:30 AM
)

我需要的是:

Array
(
    [0] => 8:15 AM-9:15 AM
    [1] => 9:30 AM-10:30 AM
    [2] => 12:30 PM-1:30 PM
    [3] => 2:00 PM-3:00 PM
    [4] => 3:30 PM-4:30 PM


)

这可能吗?

【问题讨论】:

    标签: php arrays sorting time


    【解决方案1】:

    排序通过引用工作(这意味着它对您传递给它的任何内容进行排序),它根据失败返回真/假。你在这里做什么:

    $wedTrackTimes = sort($wedTrackTimes);
    

    正在将值 $wedTrackTimes 分配为 TRUE 或 FALSE。

    试试

    sort($wedTrackTimes);
    print_r($wedTrackTimes);
    

    【讨论】:

    • 哎呀,还没完。从某种意义上说,它确实有效,但没有按预期排序。有关详细信息,请参阅 OP...
    • 你看起来需要一个自定义函数。
    • 问题在发布后 17 分钟更新。然后澄清说标准排序是不够的。需要按时间顺序排序。此答案未提供所需的排序结果。
    • @mickmackusa 这可能是真的,但是(与 Git 一样)事后编辑通常会导致不可预知的结果。
    • 编码意图和示例数据没有改变。第一个障碍是“打印 1”问题,但目标始终是按时间顺序排序。 OP 只是还没有意识到他们不明白什么。
    【解决方案2】:

    没错,sort 返回bool。只需使用它:

    sort($wedTrackTimes);
    

    【讨论】:

      【解决方案3】:

      sort,就像所有 php 的 sorting functions 一样,就地排序。如果排序成功,则返回 true,否则返回 false。如果您只对字符串/数字进行排序,则此结果无关紧要。

      $wedTrackTimes = array("9:30 AM-10:30 AM", "8:15 AM-9:15 AM",
                             "12:30 PM-1:30 PM", "2:00 PM-3:00 PM", "3:30 PM-4:30 PM");
      $wedTrackTimes = array_unique($wedTrackTimes);
      sort($wedTrackTimes);
      print_r($wedTrackTimes);
      

      是要走的路。

      【讨论】:

        【解决方案4】:

        将您的代码更改为:

        $wedTrackTimes = array_unique($wedTrackTimes);
        sort($wedTrackTimes);
        print_r($wedTrackTimes);
        

        正如您在the documentation 中看到的那样,sort() 的返回值为 true/1 或 false/0,并指示是否可以排序或发生错误。

        【讨论】:

          【解决方案5】:

          在排序前删除 $wedTrackTimes =。

           $wedTrackTimes = array("9:30 AM-10:30 AM", "8:15 AM-9:15 AM", "12:30 PM-1:30 PM", "2:00 PM-3:00 PM", "3:30 PM-4:30 PM");
           $wedTrackTimes = array_unique($wedTrackTimes);
           sort($wedTrackTimes);
           print_r($wedTrackTimes);
          

          【讨论】:

            【解决方案6】:

            所以,看起来您正在寻找比标准排序更高级的东西。

            // WARNING: THIS IS *NOT* BY REFERENCE. IT RETURNS A NEW ARRAY.
            function getSortedTimes(array $group)
            {
                $tmp = array();
                foreach( $group as $times )
                {
                    // Basically, I am pairing the string for the start time with 
                    // a numeric value.
                    $tmp[$times] = strtotime(substr($times, 0, strpos($times, '-')));
                }
                // asort is like sort, but it keeps the pairings just created.
                asort($tmp);
                // the keys of $tmp now refer to your original times.
                return array_keys($tmp);
            }
            

            【讨论】:

              【解决方案7】:

              在你的代码中

              $wedTrackTimes = array("9:30 AM-10:30 AM", "8:15 AM-9:15 AM", "12:30 PM-1:30 PM", "2:00 PM-3:00 PM", "3:30 PM-4:30 PM");
              $wedTrackTimes = array_unique($wedTrackTimes);
              **$wedTrackTimes = sort($wedTrackTimes);**
              print_r($wedTrackTimes);
              

              不要将变量分配给排序函数, 基本上你正在做的是将排序的值(将是真或假)分配给 wedTrackTimes, 而不是这种用法

              $wedTrackTimes = array("9:30 AM-10:30 AM", "8:15 AM-9:15 AM", "12:30 PM-1:30 PM", "2:00 PM-3:00 PM", "3:30 PM-4:30 PM");
                  $wedTrackTimes = array_unique($wedTrackTimes);
                  **sort($wedTrackTimes);**
                  print_r($wedTrackTimes);
              

              【讨论】:

                【解决方案8】:

                按时间(按时间顺序)明智地排序需要strtotime()

                这是一个使用array_multisort() 的单行代码。调用array_map()strtotime() 生成一个纯粹用于排序顺序的数组。

                array_multisort(array_map(function($v){return strtotime(strstr($v,'-',true));},$wedTrackTimes),$wedTrackTimes);
                

                对于迷失在该语法中的任何人,这里有更多行相同的功能。

                代码:(Demo)

                $wedTrackTimes=[
                    "9:30 AM-10:30 AM",
                    "8:15 AM-9:15 AM",
                    "12:30 PM-1:30 PM",
                    "2:00 PM-3:00 PM",
                    "3:30 PM-4:30 PM"
                ];
                
                foreach($wedTrackTimes as $time){  // iterate the time strings
                    $timestamps[]=strtotime(strstr($time,'-',true));  // store the first time of the time range as a unix timestamp
                }
                array_multisort($timestamps,$wedTrackTimes);  // use $timestamps to sort $wedTrackTimes
                
                var_export($wedTrackTimes);
                

                输出:

                array (
                  0 => '8:15 AM-9:15 AM',
                  1 => '9:30 AM-10:30 AM',
                  2 => '12:30 PM-1:30 PM',
                  3 => '2:00 PM-3:00 PM',
                  4 => '3:30 PM-4:30 PM',
                )
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2014-06-07
                  • 2017-07-20
                  • 1970-01-01
                  • 1970-01-01
                  • 2020-01-01
                  • 1970-01-01
                  • 2017-12-05
                  • 1970-01-01
                  相关资源
                  最近更新 更多