对格式为 Y-m-d 的日期数组进行排序[重复]

问题描述 投票:0回答:9

我有以下数组

$dates = array(
    '2015-02-13',
    '2015-04-21',
    '2015-08-18',
    '2015-11-26',
    '2015-09-15',
    '2015-01-07',
    '2015-02-11',
    '2015-07-14',
    '2015-03-02',
);

我想将此数组从最长的日期到最近的日期排序。

foreach ($dates as $date) {
    $date = new DateTime($date);
    // The logic I need
}
php arrays sorting date
9个回答
5
投票

您拥有的日期采用缩短的 ISO8601 格式,即

YYYY-MM-DD

它们有一个很好的功能,即词法排序顺序与日期顺序相同。因此,只需使用默认的排序函数对数组进行排序即可。会起作用的。

在代码内处理日期字符串时,使用 ISO8601 作为规范的内部日期格式总是一个好主意。尽快将用户提供的内容转换为该内容,如果用户要求输出位于自己的语言环境中,则应尽可能推迟。当然,使用“正确的”日期对象更好!


2
投票

尝试将所有日期格式转换为时间数字。

<?php
$finalArray = array();
foreach ($datesInFormatA as $date) {
    $finalArray[] = strtotime($date);
}
foreach ($datesInFormatB as $date) {
    $finalArray[] = strtotime($date);
}

对于所有日期格式都执行此操作。然后你将得到一个数字数组,你可以轻松地对它们进行排序。

$finalArray = sort($finalArray);

1
投票

您可以使用

strtotime()
进行转换以安全地进行日期操作,然后您可以对数组重新排序:

$dates = array(
    '2015-02-13',
    '2015-04-21',
    '2015-08-18',
    '2015-11-26',
    '2015-09-15',
    '2015-01-07',
    '2015-02-11',
    '2015-07-14',
    '2015-03-02',
);
$newArray = array();

foreach($dates as $value) {
    $newArray[] = strtotime($value);
}

sort($newArray);

var_dump($newArray);

1
投票

使用 PHP sort 函数

<?php
$dates = array(
    '2015-02-13',
    '2015-04-21',
    '2015-08-18',
    '2015-11-26',
    '2015-09-15',
    '2015-01-07',
    '2015-02-11',
    '2015-07-14',
    '2015-03-02',
);

sort($dates);

var_dump($dates);

输出:

array(9) {
  [0]=>
  string(10) "2015-01-07"
  [1]=>
  string(10) "2015-02-11"
  [2]=>
  string(10) "2015-02-13"
  [3]=>
  string(10) "2015-03-02"
  [4]=>
  string(10) "2015-04-21"
  [5]=>
  string(10) "2015-07-14"
  [6]=>
  string(10) "2015-08-18"
  [7]=>
  string(10) "2015-09-15"
  [8]=>
  string(10) "2015-11-26"
}

请记住,这适用于“Y-m-d”格式。对于其他格式,您需要使用 strtotime() 函数转换为日期格式,然后继续。像这样的东西(标准格式):

function sortFunction( $a, $b ) {
    return strtotime($a[0]) - strtotime($b[0]);
}
usort($dates, "sortFunction");

通过查看 m/d/y 或 d-m-y 格式的日期可以消除歧义 各个组件之间的分隔符:如果分隔符是 斜杠 (/),则采用美式 m/d/y;而如果 分隔符是破折号 (-) 或点 (.),然后是欧洲 d-m-y 格式 是假设的。


1
投票

尝试这个快速排序算法。 它的作用是,它将日期与从

Unix Timestamp
开始的
Jan 01 1970 (UTC))
进行比较,然后对其进行排序并放入数组中。

转换为

Unix Timestamp
可确保
ISO8601
日期格式。

$dates = array(
    '2015-02-13',
    '2015-04-21',
    '2015-08-18',
    '2015-11-26',
    '2015-09-15',
    '2015-01-07',
    '2015-02-11',
    '2015-07-14',
    '2015-03-02',
);

function quick_sort($array)
{
    // find array size
    $length = count($array);

    // base case test, if array of length 0 then just return array to caller
    if($length <= 1){
        return $array;
    }
    else{

        // select an item to act as our pivot point, since list is unsorted first position is easiest
        $pivot = $array[0];

        // declare our two arrays to act as partitions
        $left = $right = array();

        // loop and compare each item in the array to the pivot value, place item in appropriate partition
        for($i = 1; $i < count($array); $i++)
        {
            if(strtotime($array[$i]) < strtotime($pivot)){
                $left[] = $array[$i];
            }
            else{
                $right[] = $array[$i];
            }
        }

        // use recursion to now sort the left and right lists
        return array_merge(quick_sort($left), array($pivot), quick_sort($right));
    }
}

$sorted = quick_sort($dates);
print_r($sorted);

//输出

Array
(
    [0] 2015-01-07
    [1] 2015-02-11
    [2] 2015-02-13
    [3] 2015-03-02
    [4] 2015-04-21
    [5] 2015-07-14
    [6] 2015-08-18
    [7] 2015-09-15
    [8] 2015-11-26
)

1
投票

我为您提供了一个解决方案,希望这能帮助您进行排序,因为这对我有用。

我建议您使用

usort()
带有自定义功能:

$dates = array(
    '2015-02-13',
    '2015-04-21',
    '2015-08-18',
    '2015-11-26',
    '2015-09-15',
    '2015-01-07',
    '2015-02-11',
    '2015-07-14',
    '2015-03-02',
);

function date_fun_compare($a, $b)
    {
        $t1 = strtotime($a['datetime']);
        $t2 = strtotime($b['datetime']);
        return $t1 - $t2;
    }    
    usort($dates, 'date_fun_compare');

希望这对您有帮助。


1
投票

好吧,既然您提到您的所有日期都采用以下格式:YYYY-MM-DD、YYYY/MM/DD、DD-MM-YYYY 和 DD/MM/YYYY

首先,您需要将它们转换为单一格式,让我们使用 YYYY-MM-DD。 然后正如已经提到的,您只需要定期对其进行排序即可。

包括如何重新格式化字符串,而不必为每个字符串创建一个日期对象来进行排序。

  $dates = array(
        '2015-02-13',
        '2015-04-21',
        '2015-08-18',
        '2015-11-26',
        '2015-09-15',
        '2015/01/07',
        '2015-02-11',
        '2015/07/14',
        '2015-03-02',
        '08/01/2015',
        '08-04-2015',
    );

array_walk($dates, function(&$el){
    if($el[4] !== '-' && $el[4] !== '/'){
        // Ugly, I know, but is the fastest
        $el = $el[6] . $el[7] .$el[8] . $el[9] . '-' . $el[3] . $el[4] . '-' . $el[0] . $el[1]; 
        // Or just explode, revert array and implode
    }elseif($el[4] !== '-'){
        $el = str_replace('/', '-', $el);
    }
});
sort($dates);
print_r($dates);

将打印:

Array
(
    [0] => 2015-01-07
    [1] => 2015-01-08
    [2] => 2015-02-11
    [3] => 2015-02-13
    [4] => 2015-03-02
    [5] => 2015-04-08
    [6] => 2015-04-21
    [7] => 2015-07-14
    [8] => 2015-08-18
    [9] => 2015-09-15
    [10] => 2015-11-26
)

想要其他方式,只需使用

rsort($dates)
即可。


1
投票

php 在

MM DD YYYY
格式下运行不佳,因为
day
month
之间存在混淆。

对于您的第一个和第二个条件

YYYY-MM-DD
YYYY/MM/DD
,您可以遵循以下解决方案:

$dates = array(
    '2015-02-13',
    '2015-04-21',
    '2015-08-18',
    '2015-11-26',
    '2015-09-15',
    '2015-01-07',
    '2015-02-11',
    '2015-07-14',
    '2015-03-02',
);

function date_sorter($a, $b)
{
    $t1 = strtotime($a);
    $t2 = strtotime($b);
    return $t1 - $t2;
}
usort($dates, 'date_sorter');

// check the output
echo '<pre>'.print_r($dates,1).'</pre>'

输出:

Array
(
[0] => 2015-01-07
[1] => 2015-02-11
[2] => 2015-02-13
[3] => 2015-03-02
[4] => 2015-04-21
[5] => 2015-07-14
[6] => 2015-08-18
[7] => 2015-09-15
[8] => 2015-11-26
)

仅供参考:您可以尝试将

-
更改为
/

如果格式类似于

YYYY DD MM
(无论是
/
-
),您可以看到以下解决方案:

输入示例:

$dates = array(
   '13/02/2015',
   '21/04/2015',
   '18/08/2015',
   '26/11/2015',
   '15/09/2015',
   '07/01/2015',
   '11/02/2015',
   '14/07/2015',
   '02/03/2015',
);

功能:

function date_sorter($a, $b )
{
   $da = DateTime::createFromFormat('d/m/Y', $a); // define date format d/m/Y
   $db = DateTime::createFromFormat('d/m/Y', $b);  // define date format d/m/Y

   $t1 = strtotime($da->format('Y-m-d'));
   $t2 = strtotime($db->format('Y-m-d'));
   return $t1 - $t2;
}
usort($dates, 'date_sorter');

echo '<pre>'.print_r($dates,1).'</pre>';

输出:

Array
(
   [0] => 07/01/2015
   [1] => 11/02/2015
   [2] => 13/02/2015
   [3] => 02/03/2015
   [4] => 21/04/2015
   [5] => 14/07/2015
   [6] => 18/08/2015
   [7] => 15/09/2015
   [8] => 26/11/2015
)

0
投票

根据您的日期格式(在您的情况下可以使用 Y-m-d)只需执行排序

sort($dates);
© www.soinside.com 2019 - 2024. All rights reserved.