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

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

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

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;
}

$datesClosed

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 年之前。

php arrays sorting date
1个回答
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)
应用于结果数组一样简单,即。按键对数组进行排序。您的日期字符串将按时间顺序排列。

© www.soinside.com 2019 - 2024. All rights reserved.