0

我已经用 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;
            }
        }
    }
}

但这并没有给 usort 带来好的结果......如何做到这一点?

4

3 回答 3

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是小时、分钟和秒,在这种情况下可以忽略。

于 2012-08-04T00:04:59.870 回答
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');

这应该可以解决问题。

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

于 2012-08-03T23:21:19.520 回答
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);
于 2012-08-03T23:24:30.230 回答