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