web-dev-qa-db-ja.com

PHPで日付配列をソートする方法

この形式の配列があります:

_Array
(
    [0] => Array
        (
            [28th February, 2009] => 'bla'
        )

    [1] => Array
        (
            [19th March, 2009] => 'bla'
        )

    [2] => Array
        (
            [5th April, 2009] => 'bla'
        )

    [3] => Array
        (
            [19th April, 2009] => 'bla'
        )

    [4] => Array
        (
            [2nd May, 2009] => 'bla'
        )

) 
_

日付の昇順(月、日、年に基づく)で並べ替えたい。それを行う最良の方法は何ですか?

もともとメールはMySQLの日付形式でフェッチされているため、この状態で配列を取得することができます。

_Array
[
    ['2008-02-28']='some text',
    ['2008-03-06']='some text'
]
_

おそらく、この形式の場合、それらをループし、すべての_'-'_(ハイフン)マークを削除して、それらを整数として残し、array_sort()を使用して並べ替え、もう一度ループして並べ替えることができますそれら?ユーザーごとにこれを使用して3つのループを実行するため、別の方法があった方がよいでしょう。

ありがとう。

編集:私もこれを行うことができます:

_$array[$index]=array('human'=>'28 Feb, 2009',
                   'db'=>'20080228',
                   'description'=>'Some text here');
_

しかし、これを使用して、「db」要素のみに基づいて配列をソートする方法はありますか?

編集2:初期のvar_dumpを更新

18
Click Upvote

ISO(yyyy-mm-dd)「english」形式ではなく、次に ksort 関数を使用して正しい順序で取得します。

ハイフンを削除する必要はありません。ksortは文字列キーで英数字の比較を行い、yyyy-mm-dd形式は、字句の順序が実際の日付の順序と同じであるため、完全に機能します。

[〜#〜] edit [〜#〜]配列の配列を実際に取得したことを示すために質問を修正しました、およびソートキーがサブ配列にあること。この場合、他の場所で推奨されているようにuksortを使用する必要がありますが、人間が読める形式を解析するのではなく、DB形式の日付に基づいて独自の編集と並べ替えを行うことをお勧めします。

function cmp($a, $b)
{
    global $array;
    return strcmp($array[$a]['db'], $array[$b]['db']);
}

uksort($array, 'cmp');
42
Alnitak

実際には、これを使用してください:

usort($array, "cmp");

function cmp($a, $b){ 
    return strcmp($b['db'], $a['db']); 
}

:)

10
trend
_function cmp($a, $b) {    
    global $array;    
    return strcmp($array[$a]['db'], $array[$b]['db']); 
}    
uksort($array, 'cmp');
_

usort()の代わりにuksort()関数を使用する方が良いと思います。グローバル変数をまったく使用できないこともあり、グローバル変数を使用することも良い方法ではないためです。

4
Alexander

匿名関数を使用することもできます。

// Sort in chronological order.
usort($array, function($a, $b) {
  return strcmp($a['db'], $b['db']);
});
2
Rafal Enden