20

私はこの形式の配列を持っています:

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 を更新

4

4 に答える 4

43

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

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

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

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

uksort($array, 'cmp');
于 2009-02-28T11:07:45.720 に答える
10

実際には、これを使用します:

usort($array, "cmp");

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

:)

于 2010-12-23T03:22:12.060 に答える
4
function cmp($a, $b) {    
    global $array;    
    return strcmp($array[$a]['db'], $array[$b]['db']); 
}    
uksort($array, 'cmp');

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

于 2010-06-08T10:40:37.110 に答える
2

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

// Sort in chronological order.
usort($array, function($a, $b) {
  return strcmp($a['db'], $b['db']);
});
于 2016-02-08T16:09:41.833 に答える