如何通过PHP对日期数组进行排序?

时间:2021-01-21 16:42:38

标签: php arrays

我正在使用 array_push 和 array_unshift 方法,但是当我订购它时,它结合了 2021 年的 12-2020,这是一个示例。

        foreach ($lostOpportunities_ as $key => $value) {
            $existDate = array_search($value->fecha,$datesClosed);
            
            if ($existDate === false) {
                if (Carbon::parse($value->fecha)->format('Y') == '2020') {
                    array_unshift($datesClosed,$value);
                }else{
                    array_push($datesClosed,$value->fecha);
                }
            }
            $_lostOpportunitiesData[$value->fecha] = $value->total;
        }

Array
(
    [0] => 05-01-2021
    [1] => 06-01-2021
    [2] => 07-01-2021
    [3] => 11-01-2021
    [4] => 12-01-2021
    [5] => 13-01-2021
    [6] => 14-01-2021
    [7] => 15-01-2021
    [8] => 18-01-2021
    [9] => 19-01-2021
    [10] => 20-01-2021
    [11] => 21-01-2021
    [12] => 22-12-2020
    [13] => 23-12-2020
    [14] => 28-12-2020
    [15] => 29-12-2020
    [16] => 30-12-2020
    [17] => 08-01-2021
)

sort($datesClosed,SORT_STRING);

Array
(
    [0] => 05-01-2021
    [1] => 06-01-2021
    [2] => 07-01-2021
    [3] => 08-01-2021
    [4] => 11-01-2021
    [5] => 12-01-2021
    [6] => 13-01-2021
    [7] => 14-01-2021
    [8] => 15-01-2021
    [9] => 18-01-2021
    [10] => 19-01-2021
    [11] => 20-01-2021
    [12] => 21-01-2021
    [13] => 22-12-2020
    [14] => 23-12-2020
    [15] => 28-12-2020
    [16] => 29-12-2020
    [17] => 30-12-2020
)

如您所见,2020 年 12 月的那些在末尾,但它们应该在开头和 01-2021 之前。

1 个答案:

答案 0 :(得分:2)

可以在日期字符串数组上使用 usort 来做到这一点。你会比较它们,例如在所有日期使用 strotime($a) <=> strtotime($b)array_reverse(explode('-', $a)) <=> ... $b。但是,考虑到比较每个项目时将进行的笛卡尔(?)转换量,除非转换以某种方式缓存,否则这种方法将很快成为一项非常昂贵的操作。我不会在这里走这条路。

一般来说,最好在数据仍然采用更易于比较的格式时对数据进行排序,只要可能。我不认为你可以只 usort Carbon 对象(没有一些开销,如上所述,无论如何!),所以这里有一个性能良好的简洁解决方案。

假设数组键对您没有特殊意义,您可以为键生成时间戳。然后,您可以取消所有 unshift/push 逻辑,只需执行以下操作:

$timestamp = Carbon::parse($value->fecha)->timestamp;
$times[$timestamp] = $value;

这将为您提供一个带有时间戳索引的日期字符串数组(此处为 $times)。 (调整变量以适应您的情况。)然后就像将 ksort($times) 应用于结果数组一样简单,即。按键对数组进行排序。您的日期字符串将按时间顺序排列。

相关问题