0

以下のような単なる文字列である Month フィールドを含む配列があります。

Array
(
    [0] => stdClass Object
        (
            [id] => 1
            [Month] => Jan-13
        )

    [1] => stdClass Object
        (
            [id] => 2
            [Month] => Jan-14
        )

    [2] => stdClass Object
        (
            [id] => 3
            [Month] => Jul-12
        )

)

この配列を日付順に並べ替えるにはどうすればよいですか?

ありがとう。

4

2 に答える 2

1

明らかにカスタムソートが必要なので、usortを使用してください。これにより、コンパレータが残ります。それほどきれいではない方法は、次のようになります。

function datescompare($a, $b) {
    $a = str_replace('-', ' 20', $a->Month); //changing year to full number to avoid treating it as day number
    $b = str_replace('-', ' 20', $b->Month); //same with $b

    $a = strtotime($a); //dirty, but works
    $b = strtotime($b);

    return ($a-$b);
}

呼び出し例:

uasort($array, 'datescompare');

おそらくいくつかの検証を追加したいでしょう (年が 2000 年より前の場合、文字列が正しくない場合など) が、上記はおおよそうまくいくはずです。

于 2012-08-02T11:34:36.843 に答える
0

これを試すことができます

$array = array();
$array[0] = new stdClass();
$array[0]->id = 1 ;
$array[0]->Month = "Jul-13" ;


$array[1] = new stdClass();
$array[1]->id = 2 ;
$array[1]->Month = "Jul-14" ;

$array[2] = new stdClass();
$array[2]->id = 3 ;
$array[2]->Month = "Jul-12" ;




function cmp($a, $b) {
    $aDate = DateTime::createFromFormat("M-d",$a->Month);
    $bDate = DateTime::createFromFormat("M-d",$b->Month);
    return $aDate->getTimestamp() - $bDate->getTimestamp();
}


usort($array, "cmp");
var_dump($array);

出力

array
  0 => 
    object(stdClass)[3]
      public 'id' => int 3
      public 'Month' => string 'Jul-12' (length=6)
  1 => 
    object(stdClass)[1]
      public 'id' => int 1
      public 'Month' => string 'Jul-13' (length=6)
  2 => 
    object(stdClass)[2]
      public 'id' => int 2
      public 'Month' => string 'Jul-14' (length=6)
于 2012-08-02T11:41:11.683 に答える