0

PHPで、配列を日付で並べ替えて表示できる方法はありますか?asortまたはusortに似ていますか?

問題は、日付フィールドに「UNKNOWN」などの値が含まれる可能性があることです。すべてのレコードを日付の降順で印刷し、最後にUNKNOWNSを印刷したいと思います。これが私のこれまでのコードです。

foreach ($MailPieceArr as $key => $val) {

    $count++;
    if (($count % 2) == 1) {
        print "<tr bgcolor='#CCCCCC'>";
    } else {
        print "<tr bgcolor=white>";
    }

    print "<td align=center>".$MailPieceArr[$key]["type"]."</td>";
    print "<td align=center>".$MailPieceArr[$key]["id"]."</td>";
    print "<td align=center>".$MailPieceArr[$key]["ddate"]."</td>";
    print "<td align=center>".$MailPieceArr[$key]["acode"]."</td>";

    print "</tr>";
}

これが私の配列がどのように見えるかです:

print_r($MailPieceArr);

出力:

Array
(
    [0] => Array
        (
            [type] => First-Class
            [id] => 77770056
            [ddate] => 11/26/2012
            [acode] => 2643
        )

    [1] => Array
        (
            [type] => First-Class
            [id] => 77770057
            [ddate] => 11/26/2012
            [acode] => 2643
        )

    [2] => Array
        (
            [type] => First-Class
            [id] => 77770058
            [ddate] => 11/21/2012
            [acode] => 2641
        )

    [3] => Array
        (
            [type] => First-Class
            [id] => 77770059
            [ddate] => 11/21/2012
            [acode] => 2641
        )

    [4] => Array
        (
            [type] => First-Class
            [id] => 77770042
            [ddate] => 10/29/2012
            [acode] => 2623
        )

    [5] => Array
        (
            [type] => First-Class
            [id] => 77770041
            [ddate] => 10/29/2012
            [acode] => 2623
        )

    [6] => Array
        (
            [type] => RR
            [id] => 88880001
            [ddate] => 10/29/2012
            [acode] => 2621
        )

    [7] => Array
        (
            [type] => First-Class
            [id] => 77770043
            [ddate] => 10/17/2012
            [acode] => 2625
        )

    [8] => Array
        (
            [type] => First-Class
            [id] => 77770044
            [ddate] => 10/17/2012
            [acode] => 2625
        )

    [9] => Array
        (
            [type] => RR
            [id] => 88880005
            [ddate] => 10/17/2012
            [acode] => 2619
        )

    [10] => Array
        (
            [type] => IMB
            [id] => 0001101111111111110011111111111
            [ddate] => UNKNOWN   
            [acode] => 2643
        )

)
4

3 に答える 3

1

並べ替え関数で使用するstrtotimeと、タイムスタンプを比較しやすくなるだけでなく、無効な日付形式に対して false を返します。

function date_sort($a, $b)
{
    $t1 = strtotime($a['ddate']);
    $t2 = strtotime($b['ddate']);

    if($t1 == false || $t2 == false)
        return 1;

    return $t2 - $t1;
}    
usort($array, 'date_sort');

この例のようなものを生成するのに役立ちます。

于 2012-11-26T23:43:20.280 に答える
0

日付をunixtimestamptに変換すると、比較が容易になります。

于 2012-11-26T23:33:28.293 に答える
0

を使用usort()すると、完全にカスタムの比較関数を使用して配列を並べ替えることができます。

<?php
date_default_timezone_set('UTC');

$array  = array(
    array(
        'type'  => 'First-Class',
        'id'    => 7770057,
        'ddate' => '2012/11/26',
        'acode' => 2643
    ),
    array(
        'type'  => 'First-Class',
        'id'    => 7770058,
        'ddate' => '2012/11/21',
        'acode' => 2643
    ),
    array(
        'type'  => 'First-Class',
        'id'    => 7770059,
        'ddate' => 'UNKNOWN',
        'acode' => 2643
    ),
    array(
        'type'  => 'First-Class',
        'id'    => 7770060,
        'ddate' => 'UNKNOWN',
        'acode' => 2643
    ),
    array(
        'type'  => 'First-Class',
        'id'    => 7770061,
        'ddate' => '2012/11/30',
        'acode' => 2643
    ),
);


echo 'Before:'.PHP_EOL;
foreach($array as $item){
    echo $item['id'].': '.$item['ddate'].PHP_EOL;
}

usort($array, function($a, $b){
    if($a['ddate'] == 'UNKNOWN'){
            // Place UNKNOWN at end
        return 1;
    }

    if($a['ddate'] == $b['ddate']){
            // Dates are the same
        return 0;
    }
    return (strtotime($a['ddate']) > strtotime($b['ddate'])) ? -1 : 1;
});

echo 'After:'.PHP_EOL;
foreach($array as $item){
    echo $item['id'].': '.$item['ddate'].PHP_EOL;
}

ただし、日付オブジェクトを格納するためにPHP のDateTime クラスを使用することを検討する必要があります。文字列の使用はあいまいになる可能性があります。たとえば、2012 年 11 月 12 日は 12 月 11 日ですか、それとも 11 月 12 日ですか?

于 2012-11-26T23:43:52.167 に答える