按日期排序多维数组

时间:2012-08-03 23:00:22

标签: php date multidimensional-array sorting

我用usort试过了,但是我没有成功。 我有以下数组:

array(
    [0] => array(
        'date' => '3:6:2012'
    ),
    [1] => array(
        'date' => '5:5:2012'
    ),
    [2] => array(
        'date' => '20:12:2011'
    )
)

日期是d:m:yyyy格式,所以没有前导零。 我想对数组进行排序以获得此结果:

array(
    [0] => array(
        'date' => '20:12:2011'
    ),
    [1] => array(
        'date' => '5:5:2012'
    ),
    [2] => array(
        'date' => '3:6:2012'
    )
)

我试过这种方式:

function cmp($a, $b) {
    if($a['date'] = $b['date']) {
        return 0;
    }
    $partsa = explode(":", $a['date']);
    $partsb = explode(":", $b['date']);
    $daya = $partsa[0];
    $montha = $partsa[1];
    $yeara = $partsa[2];
    $dayb = $partsb[0];
    $monthb = $partsb[1];
    $yearb = $partsb[2];
    if($yeara < $yearb) {
        return -1;
    } elseif($yeara > $yearb) {
        return 1;
    } elseif($yeara == $yearb) {
        if($montha < $monthb) {
            return -1;
        } elseif($montha > $monthb) {
            return 1;
        } elseif($montha == $monthb) {
            if($daya < $dayb) {
                return -1;
            } elseif($daya > $dayb) {
                return 1;
            } elseif($daya == $dayb) {
                return 0;
            }
        }
    }
}

但这并没有给出良好的结果... 怎么做?

3 个答案:

答案 0 :(得分:0)

首先,让它们成为日期(正常,php可读日期):

foreach($array as $innerarray){
    foreach($innerarray as $key=>$value){
        $date = explode(":", $value);
        $date = date($date[2]."/".$date[1]."/".$date[0]);
        $array[$innerarray][$key] = $date;
    }
}

在此之后,您可以使用以下功能对它们进行排序:

 function sort_bydate($a, $b) { 
     return strnatcmp($a['date'], $b['date']); 
 } 
 // sort by date 
 usort($data, 'sort_bydate');

这应该可以解决问题。

顺便说一句,我建议不要在数组中使用数组,因为在你的情况下它是没用的。

答案 1 :(得分:0)

您可以使用标准化日期(yyyymmdd)创建临时数组,然后使用array_multisort

$arr = array(
    array(
        'date' => '3:6:2012'
    ),
    array(
        'date' => '5:5:2012'
    ),
    array(
        'date' => '20:12:2011'
    ),
    array(
        'foo' => 'no date here'
    ),
);

foreach($arr as $key=>$row) {
    if(isset($row['date'])) {
        $date = explode(':',$row['date']);
        $date = $date[2] . str_pad($date[1],2,'0',STR_PAD_LEFT) . str_pad($date[0],2,'0',STR_PAD_LEFT);
        $sort_arr[$key] = $date;
    } else {
        $sort_arr[$key] = null;
    }
}
array_multisort($sort_arr, SORT_ASC, $arr);
print_r($arr);

答案 2 :(得分:0)

PHP提供了strcmp函数,它为我们做了比较。为了正确比较日期,我们创建了时间戳。

但首先我们需要解析字符串::爆炸,最后将它们扔到mktime

function cmp($a, $b) {
    $a = explode(':', $a['date']);
    $a = mktime(0, 0, 0, intval($a[1]), intval($a[0]), intval($a[2]));

    $b = explode(':', $b['date']);
    $b = mktime(0, 0, 0, intval($b[1]), intval($b[0]), intval($b[2]));

    return strcmp($a, $b); 
}

注意:mktime的前三个参数是小时,分钟和秒,在这种情况下可以忽略。