使用usort()和sort()函数按mktime()转换的时间戳对日期数组进行排序

时间:2012-11-18 07:53:45

标签: php

我有一个日期数组,我必须使用所描述的函数对其进行排序。

这就是我所拥有的:

$dates = array ('10-10-2003', '2-17-2002', '2-16-2003','1-01-2005', '10-10-2004' );
function date_to_timestamp($d){
$newarr = array();
foreach($d as $f) {
    $arr=explode("-",$f);
    array_push($newarr, mktime(0,0,0,$arr[0],$arr[1],$arr[2]));
}
return $newarr;
}

function cmp2($a, $b)
{
if ($a == $b) {
    return 0;
}
return ($a < $b) ? -1 : 1;
}

$third = date_to_timestamp($dates);


usort($third, "cmp2");
print_r($third);

?>

之后,这是我得到的疯狂输出:

阵 (     [0] =&gt; 1013922000     [1] =&gt; 1045371600     [2] =&gt; 1065758400     [3] =&gt; 1097380800     [4] =&gt; 1104555600 )

我的错误在哪里?我将非常感谢您提供解决方案的任何帮助。

2 个答案:

答案 0 :(得分:0)

在你的date_tim_timestamp函数中,你实际上是在抛弃你的日期来代替整数值。

请改为尝试:

function date_to_timestamp($d){
    $newarr = array();
    foreach($d as $f) {
        $arr=explode("-",$f);
        //array_push($newarr, mktime(0,0,0,$arr[0],$arr[1],$arr[2]));
        $int_version = mktime(0,0,0,$arr[0],$arr[1],$arr[2]);
        $newarr[$int_version] = $f;
    }
    return $newarr;
}

使用这种方法,您不需要使用usort(),只需要使用kso​​rt()

答案 1 :(得分:0)

这是替代解决方案。

<?php
$dates = array(
    '10-10-2003',
    '2-17-2002',
    '2-16-2003',
    '1-01-2005',
    '10-10-2004',
);

function toTime($date) {
    list($month, $day, $year) = explode('-', $date);
    return mktime(0, 0, 0, $month, $day, $year);
}

function sortByTime($a, $b) {
    $a = toTime($a);
    $b = toTime($b);
    if($a == $b) {
        return 0;
    }
    return $a < $b ? -1 : 1 ;
}

usort($dates, 'sortByTime');

print_r($dates);

/*
    Array
    (
        [0] => 2-17-2002
        [1] => 2-16-2003
        [2] => 10-10-2003
        [3] => 10-10-2004
        [4] => 1-01-2005
    )
*/