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

正規化された日付 ( 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 に答える
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

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); 
}

注: の最初の 3 つの引数mktimeは時間、分、秒であり、このシナリオでは無視できます。

于 2012-08-04T00:04:59.870 に答える