为什么这个 usort 不排序日期数组?
Why is this usort not ordering an array of dates?
我试图按时间顺序排列这个数组:
$ta = array (
0 => '20/05/2012',
1 => '08/01/2011',
2 => '23/10/2010',
3 => '27/07/2013',
4 => '28/01/2011',
5 => '21/10/2010',
5 => '18/07/2013',
);
function comp2($a, $b) {
if ($a == $b)
return 0;
return ($a < $b) ? 1 : -1;
};
usort($ta,'comp2');
这个returns:
Array
(
[0] => 28/01/2011
[1] => 27/07/2013
[2] => 23/10/2010
[3] => 20/05/2012
[4] => 18/07/2013
[5] => 08/01/2011
)
我也用strtotime
转换了日期,后来改成mm/dd/yyyy
也无济于事。
仅将它们按字符串排序是行不通的,因为它会按字母顺序对它们进行排序。 1988 年 1 月的第一天将在 2015 年 12 月的最后一天之前出现,因为它以第一个字符 - 天开始。
因此您必须将字符串转换为日期。这里的问题是 strtotime()
不接受 dd/mm/YYYY
格式。使用 this 解决方法,您将获得以下代码:
function comp2($a, $b) {
$x = toDate($a);
$y = toDate($b);
if ($x == $y) return 0;
return ($x < $y) ? 1 : -1;
}
function toDate($d) {
return strtotime(str_replace('/', '-', $d));
}
如果您有很多日期要排序,那么这不是很有效。同一日期将与多个日期进行比较,因此会多次转换。那是一种资源浪费。因此,如果性能是一个问题,请循环遍历数组并转换所有日期,然后仅使用 sort()
对其进行排序。之后,您可以使用 date()
.
转换回您想要的任何格式
你可以像
一样简单地使用usort
usort($ta,function($a,$b){
return strtotime(str_replace('/', '-', $a)) - strtotime(str_replace('/', '-', $b));
});
简要说明:
此处您拥有的日期结构是美国日期格式,即 m/d/Y
。因此需要首先将其替换为欧洲日期格式,即 d-m-y
。您可以查看 答案 PHP 将日期转换为 strtotime。
我试图按时间顺序排列这个数组:
$ta = array (
0 => '20/05/2012',
1 => '08/01/2011',
2 => '23/10/2010',
3 => '27/07/2013',
4 => '28/01/2011',
5 => '21/10/2010',
5 => '18/07/2013',
);
function comp2($a, $b) {
if ($a == $b)
return 0;
return ($a < $b) ? 1 : -1;
};
usort($ta,'comp2');
这个returns:
Array
(
[0] => 28/01/2011
[1] => 27/07/2013
[2] => 23/10/2010
[3] => 20/05/2012
[4] => 18/07/2013
[5] => 08/01/2011
)
我也用strtotime
转换了日期,后来改成mm/dd/yyyy
也无济于事。
仅将它们按字符串排序是行不通的,因为它会按字母顺序对它们进行排序。 1988 年 1 月的第一天将在 2015 年 12 月的最后一天之前出现,因为它以第一个字符 - 天开始。
因此您必须将字符串转换为日期。这里的问题是 strtotime()
不接受 dd/mm/YYYY
格式。使用 this 解决方法,您将获得以下代码:
function comp2($a, $b) {
$x = toDate($a);
$y = toDate($b);
if ($x == $y) return 0;
return ($x < $y) ? 1 : -1;
}
function toDate($d) {
return strtotime(str_replace('/', '-', $d));
}
如果您有很多日期要排序,那么这不是很有效。同一日期将与多个日期进行比较,因此会多次转换。那是一种资源浪费。因此,如果性能是一个问题,请循环遍历数组并转换所有日期,然后仅使用 sort()
对其进行排序。之后,您可以使用 date()
.
你可以像
一样简单地使用usort
usort($ta,function($a,$b){
return strtotime(str_replace('/', '-', $a)) - strtotime(str_replace('/', '-', $b));
});
简要说明:
此处您拥有的日期结构是美国日期格式,即 m/d/Y
。因此需要首先将其替换为欧洲日期格式,即 d-m-y
。您可以查看