我有以下数组
$dates = array(
'2015-02-13',
'2015-04-21',
'2015-08-18',
'2015-11-26',
'2015-09-15',
'2015-01-07',
'2015-02-11',
'2015-07-14',
'2015-03-02',
);
我想从最久前到最近的日期对这个数组进行排序。
foreach ($dates as $date) {
$date = new DateTime($date);
// The logic I need
}
你可以帮帮我吗?
我想指出日期格式可能会有所不同。为了详细说明,我的数据库中的日期格式为YYYY-MM-DD
,YYYY/MM/DD
,DD-MM-YYYY
和DD/MM/YYYY
。
但如下所示,我可以重新格式化日期并构建一个新数组。所以这可能不是问题。
答案 0 :(得分:5)
您所拥有的日期采用缩短的ISO8601格式,即YYYY-MM-DD
。
这些具有很好的功能,即词法排序顺序与日期顺序相同。因此,只需使用默认排序函数对数组进行排序。它会起作用。
在代码中处理日期字符串时,将ISO8601作为规范的内部日期格式始终是个好主意。尽快将用户提供的内容转换为该内容,如果用户要求输出位于他们自己的语言环境中,则将其推迟到尽可能晚。当然,使用"适当的"日期对象更好!
答案 1 :(得分:2)
尝试将所有日期格式转换为时间数字。
<?php
$finalArray = array();
foreach ($datesInFormatA as $date) {
$finalArray[] = strtotime($date);
}
foreach ($datesInFormatB as $date) {
$finalArray[] = strtotime($date);
}
对于所有日期格式,请执行此操作。然后你会得到一组数字,你可以轻松地对它们进行排序。
$finalArray = sort($finalArray);
答案 2 :(得分:1)
使用PHP sort功能
<?php
$dates = array(
'2015-02-13',
'2015-04-21',
'2015-08-18',
'2015-11-26',
'2015-09-15',
'2015-01-07',
'2015-02-11',
'2015-07-14',
'2015-03-02',
);
sort($dates);
var_dump($dates);
输出:
array(9) {
[0]=>
string(10) "2015-01-07"
[1]=>
string(10) "2015-02-11"
[2]=>
string(10) "2015-02-13"
[3]=>
string(10) "2015-03-02"
[4]=>
string(10) "2015-04-21"
[5]=>
string(10) "2015-07-14"
[6]=>
string(10) "2015-08-18"
[7]=>
string(10) "2015-09-15"
[8]=>
string(10) "2015-11-26"
}
请记住,这适用于'Y-m-d'格式。对于其他格式,您需要使用strtotime()函数转换为日期格式,并需要继续。这样的东西(标准格式):
function sortFunction( $a, $b ) {
return strtotime($a[0]) - strtotime($b[0]);
}
usort($dates, "sortFunction");
通过查看,可以消除m / d / y或d-m-y格式的日期 各个组件之间的分隔符:如果分隔符是a 斜线(/),然后是美国m / d / y;而如果 separator是短划线( - )或点(。),然后是欧洲d-m-y格式 假定。
答案 3 :(得分:1)
您可以使用strtotime()
转换为安全日期操作,然后您可以重新排序数组:
$dates = array(
'2015-02-13',
'2015-04-21',
'2015-08-18',
'2015-11-26',
'2015-09-15',
'2015-01-07',
'2015-02-11',
'2015-07-14',
'2015-03-02',
);
$newArray = array();
foreach($dates as $value) {
$newArray[] = strtotime($value);
}
sort($newArray);
var_dump($newArray);
答案 4 :(得分:1)
好吧,既然你提到你的所有日期都是以下格式:YYYY-MM-DD,YYYY / MM / DD,DD-MM-YYYY和DD / MM / YYYY
首先,您需要将它们转换为单一格式,然后使用YYYY-MM-DD。 然后如前所述,您只需要定期对其进行排序。
包括如何重新格式化字符串,而不必为每个字符串创建日期对象。
$dates = array(
'2015-02-13',
'2015-04-21',
'2015-08-18',
'2015-11-26',
'2015-09-15',
'2015/01/07',
'2015-02-11',
'2015/07/14',
'2015-03-02',
'08/01/2015',
'08-04-2015',
);
array_walk($dates, function(&$el){
if($el[4] !== '-' && $el[4] !== '/'){
// Ugly, I know, but is the fastest
$el = $el[6] . $el[7] .$el[8] . $el[9] . '-' . $el[3] . $el[4] . '-' . $el[0] . $el[1];
// Or just explode, revert array and implode
}elseif($el[4] !== '-'){
$el = str_replace('/', '-', $el);
}
});
sort($dates);
print_r($dates);
将打印:
Array
(
[0] => 2015-01-07
[1] => 2015-01-08
[2] => 2015-02-11
[3] => 2015-02-13
[4] => 2015-03-02
[5] => 2015-04-08
[6] => 2015-04-21
[7] => 2015-07-14
[8] => 2015-08-18
[9] => 2015-09-15
[10] => 2015-11-26
)
想要以其他方式,只需使用rsort($dates)
。
答案 5 :(得分:1)
尝试这种快速排序算法。
它的作用是,它将日期Unix Timestamp
从Jan 01 1970 (UTC))
开始比较并对其进行排序并放入数组中。
转换为Unix Timestamp
确保ISO8601
日期格式。
$dates = array(
'2015-02-13',
'2015-04-21',
'2015-08-18',
'2015-11-26',
'2015-09-15',
'2015-01-07',
'2015-02-11',
'2015-07-14',
'2015-03-02',
);
function quick_sort($array)
{
// find array size
$length = count($array);
// base case test, if array of length 0 then just return array to caller
if($length <= 1){
return $array;
}
else{
// select an item to act as our pivot point, since list is unsorted first position is easiest
$pivot = $array[0];
// declare our two arrays to act as partitions
$left = $right = array();
// loop and compare each item in the array to the pivot value, place item in appropriate partition
for($i = 1; $i < count($array); $i++)
{
if(strtotime($array[$i]) < strtotime($pivot)){
$left[] = $array[$i];
}
else{
$right[] = $array[$i];
}
}
// use recursion to now sort the left and right lists
return array_merge(quick_sort($left), array($pivot), quick_sort($right));
}
}
$sorted = quick_sort($dates);
print_r($sorted);
//输出
Array
(
[0] 2015-01-07
[1] 2015-02-11
[2] 2015-02-13
[3] 2015-03-02
[4] 2015-04-21
[5] 2015-07-14
[6] 2015-08-18
[7] 2015-09-15
[8] 2015-11-26
)
答案 6 :(得分:1)
我有一个解决方案,希望这可以帮助您排序,因为这对我有用。
我建议您使用usort()
使用自定义功能:
$dates = array(
'2015-02-13',
'2015-04-21',
'2015-08-18',
'2015-11-26',
'2015-09-15',
'2015-01-07',
'2015-02-11',
'2015-07-14',
'2015-03-02',
);
function date_fun_compare($a, $b)
{
$t1 = strtotime($a['datetime']);
$t2 = strtotime($b['datetime']);
return $t1 - $t2;
}
usort($dates, 'date_fun_compare');
希望这会对你有所帮助。
答案 7 :(得分:0)
根据您的日期格式(在您的情况下可以使用Y-m-d),只需执行排序
sort($dates);
答案 8 :(得分:0)
MM DD YYYY
和day
之间的混淆, php在格式month
中效果不佳。
对于您的第一个和第二个条件YYYY-MM-DD
或YYYY/MM/DD
,您可以遵循此解决方案:
$dates = array(
'2015-02-13',
'2015-04-21',
'2015-08-18',
'2015-11-26',
'2015-09-15',
'2015-01-07',
'2015-02-11',
'2015-07-14',
'2015-03-02',
);
function date_sorter($a, $b)
{
$t1 = strtotime($a);
$t2 = strtotime($b);
return $t1 - $t2;
}
usort($dates, 'date_sorter');
// check the output
echo '<pre>'.print_r($dates,1).'</pre>'
输出:
Array
(
[0] => 2015-01-07
[1] => 2015-02-11
[2] => 2015-02-13
[3] => 2015-03-02
[4] => 2015-04-21
[5] => 2015-07-14
[6] => 2015-08-18
[7] => 2015-09-15
[8] => 2015-11-26
)
仅供参考:您可以尝试将-
更改为/
如果格式类似于YYYY DD MM
(无论是/
还是-
),您可以看到以下解决方案:
示例输入:
$dates = array(
'13/02/2015',
'21/04/2015',
'18/08/2015',
'26/11/2015',
'15/09/2015',
'07/01/2015',
'11/02/2015',
'14/07/2015',
'02/03/2015',
);
功能:
function date_sorter($a, $b )
{
$da = DateTime::createFromFormat('d/m/Y', $a); // define date format d/m/Y
$db = DateTime::createFromFormat('d/m/Y', $b); // define date format d/m/Y
$t1 = strtotime($da->format('Y-m-d'));
$t2 = strtotime($db->format('Y-m-d'));
return $t1 - $t2;
}
usort($dates, 'date_sorter');
echo '<pre>'.print_r($dates,1).'</pre>';
输出:
Array
(
[0] => 07/01/2015
[1] => 11/02/2015
[2] => 13/02/2015
[3] => 02/03/2015
[4] => 21/04/2015
[5] => 14/07/2015
[6] => 18/08/2015
[7] => 15/09/2015
[8] => 26/11/2015
)
然而,也许它会帮助你。