【问题标题】:sort array based on the dateTime in php根据php中的dateTime对数组进行排序
【发布时间】:2011-12-28 14:32:17
【问题描述】:
Array
        (
            [0] => Array
                (
                    [dateTime] => 2011-10-18 0:0:00
                    [chanl1] => 20.7
                    [chanl2] => 45.4
                    [chanl3] => 
                )

            [1] => Array
                (
                    [dateTime] => 2011-10-18 0:15:00
                    [chanl1] => 20.7
                    [chanl2] => 45.4
                    [chanl3] => 
                )


            [2] => Array
                (
                    [dateTime] => 2011-10-18 00:14:00
                    [chanl1] => 20.7
                    [chanl2] => 33.8
                    [chanl3] => 
                )

            [3] => Array
                (
                    [dateTime] => 2011-10-18 00:29:00
                    [chanl1] => 20.6
                    [chanl2] => 33.9
                    [chanl3] => 
                )

我想根据[dateTime]对上面的数组进行排序,最终输出应该是:

Array
        (
            [0] => Array
                (
                    [dateTime] => 2011-10-18 0:0:00
                    [chanl1] => 20.7
                    [chanl2] => 45.4
                    [chanl3] => 
                )

            [1] => Array
                (
                    [dateTime] => 2011-10-18 00:14:00
                    [chanl1] => 20.7
                    [chanl2] => 33.8
                    [chanl3] => 
                )

            [2] => Array
                (
                    [dateTime] => 2011-10-18 0:15:00
                    [chanl1] => 20.7
                    [chanl2] => 45.4
                    [chanl3] => 
                )            

            [3] => Array
                (
                    [dateTime] => 2011-10-18 00:29:00
                    [chanl1] => 20.6
                    [chanl2] => 33.9
                    [chanl3] => 
                )

有人知道怎么做吗?谢谢!

【问题讨论】:

    标签: php arrays sorting


    【解决方案1】:

    使用带有自定义排序回调的uasort() 应该可以做到:

    function cmp($a, $b) {
      if ($a['dateTime'] == $b['dateTime']) {
        return 0;
      }
    
      return ($a['dateTime'] < $b['dateTime']) ? -1 : 1;
    }
    
    uasort($arr, 'cmp');
    

    uasort() 保留数组的键,如果不需要,可以使用 usort()

    【讨论】:

    • 您不应将字符串值与&lt; 运算符进行比较。
    • @Petah 因为您假设特定的日期格式,所以 Crozins 的答案更有用。
    • @h.coates 是的,您是正确的,我假设它采用示例数据中给出的格式。为什么不会呢?
    【解决方案2】:

    usort() function 与自定义比较器一起使用:

    $arr = array(...);
    
    usort($arr, function($a, $b) {
      $ad = new DateTime($a['dateTime']);
      $bd = new DateTime($b['dateTime']);
    
      if ($ad == $bd) {
        return 0;
      }
    
      return $ad < $bd ? -1 : 1;
    });
    

    DateTime 类具有重载的比较运算符(&lt;&gt;==)。

    【讨论】:

    • @Crozin 一个常见的误解是 usort 必须返回 -1,0,1。如手册所述:如果认为第一个参数分别小于、等于或大于第二个参数,则比较函数必须返回一个小于、等于或大于零的整数。这意味着任何值&lt;=&gt;0
    • @Gordon:是的,我知道这个事实,但是如果我们操作的不是数字(在这种情况下为 DateTime),通常的做法是返回 ±1
    • 三元不是倒过来的吗?除非我遗漏了一些愚蠢的东西,否则如果第一个值小于第二个值,那么您应该返回一个 return $ad < $bd ? -1 : 1;
    • 注意:切换 -1 和 1 以将一般顺序更改为降序
    • 很高兴我们可以在 PHP 7 中使用宇宙飞船运算符&lt;=&gt;。:)
    【解决方案3】:

    使用 array_multisort :

     <?php
            $myarray=array(
                        0 => array
                            (
                                'dateTime' => '2011-10-18 00:0:00',
                                'chanl1' => '20.7',
                                'chanl2' => '45.4',
                                'chanl3' => '',
                            ),
    
                        1 => array
                            (
                                'dateTime' => '2011-10-18 00:15:00',
                                'chanl1' => '20.7',
                                'chanl2' => '45.4',
                                'chanl3' => '',
                            ),
                      2 => array
                            (
                                'dateTime' => '2011-10-18 00:14:00',
                                'chanl1' => '20.7',
                                'chanl2' => '33.8',
                                'chanl3' => '',
                            ),
    
                        3 => array
                            (
                                'dateTime' => '2011-10-18 00:29:00',
                                'chanl1' => '20.6',
                                'chanl2' => '33.9',
                                'chanl3' => ''
                            ));
    
                foreach($myarray as $c=>$key) {
                        $dateTime[] = $key['dateTime'];
                    $chanl1[] = $key['chanl1'];
                        $chanl2[] = $key['chanl2'];
                        $chanl3[] = $key['chanl3'];
                }
    
            array_multisort($dateTime,SORT_ASC,SORT_STRING,$myarray);   
            print_r($myarray);
    

    【讨论】:

      【解决方案4】:

      为了性能,这种使用array_multisort的方法非常efficient

      $ord = array();
      foreach ($array as $key => $value){
          $ord[] = strtotime($value['dateTime']);
      }
      array_multisort($ord, SORT_ASC, $array);
      print_r($array);
      

      【讨论】:

      • 我试图对一组日期时间对象进行排序,这对我来说非常有用。谢谢!我将其修改为 array_multisort($array, SORT_ASC, $array);
      【解决方案5】:

      对于 php 数组和对象,此示例有助于排序...

      对于日期时间降序:

      usort($response_data['callback'], function($a, $b) {
         return strcasecmp(strtotime($b->view_date), strtotime($a->view_date));
      });
      

      对于日期时间升序:

      usort($response_data['callback'], function($a, $b) {
         return strtotime($a->view_date) - strtotime($b->view_date);
      });
      

      【讨论】:

      • 我喜欢您解决方案的减法部分。这非常简洁,并且(至少对我而言)比整个$a &lt; $b ? -1 : ($a &gt; $b ? 1 : 0) 的东西更好读。 ... 对于当前的 PHP 版本,我宁愿使用宇宙飞船运算符&lt;=&gt;,但在单一情况下,您不能将正在运行的项目切换到最新的 PHP 版本(就像我目前的情况一样,客户有一些......“问题”更新。;))。
      【解决方案6】:

      使用 spaceship 运算符对 DateTime 对象进行简单排序:

      $list = [
          new DateTime('yesterday'),
          new DateTime('today'),
          new DateTime('1 week ago'),
      ];
      
      uasort($list, function ($a, $b) {
          return $a <=> $b;
      });
      
      var_dump($list);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-17
        • 2020-11-18
        • 2016-11-17
        • 2011-10-28
        • 2016-10-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多