我正在使用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年的开始之前。
您可以usort
对日期字符串数组使用此功能。您可以将它们与strotime($a) <=> strtotime($b)
或array_reverse(explode('-', $a)) <=> ... $b
在所有日期进行比较。但是,考虑到比较每个项目时要进行的笛卡尔(?)转换量,这种方法很快就会变成非常昂贵的操作,除非以某种方式缓存了这些转换。我不会在这里走这条路。
通常,最好在所有数据仍处于更容易比较的格式下对数据进行排序。我认为您不能只使用usort
Carbon对象(无论如何,都没有上面的开销!),因此这是一种性能良好的简洁解决方案。
假设数组键对您没有特殊意义,则可以为键生成时间戳。然后,您可以取消所有取消移位/推送逻辑,只需执行以下操作:
$timestamp = Carbon::parse($value->fecha)->timestamp;
$times[$timestamp] = $value;
这将为您提供$times
带有时间戳索引的日期字符串数组(此处为)。(使变量适应您的情况。)然后,将其与应用到结果数组一样琐碎。按键对数组排序。您的日期字符串将按时间顺序排列。ksort
($times)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句