我正在使用 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 年之前。
您可以在日期字符串数组上使用
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)
应用于结果数组一样简单,即。按键对数组进行排序。您的日期字符串将按时间顺序排列。