0

キーを使用してこの配列を日付でソートするにはどうすればよいですか

Array
(
    [Jun '12] => 2037
    [May '12] => 4615
    [Apr '12] => 4175
    [Mar '12] => 4548
    [Feb '12] => 2758
    [Jan '12] => 3077
    [Jul '12] => 0
)

このコールバック関数で uksort を試してみましたが、そのような運はありませんでした。

function datediff($a, $b) {
     strtotime($a);
    $a = date('U',strtotime($a));
    $b = date('U',strtotime($b));

    if ($a == $b) $r = 0;
    else $r = ($a > $b) ? 1: -1;

    return $r;
}

どんな助けでも大歓迎です。ありがとう!

4

3 に答える 3

1

カスタム マッピングを作成できます

$date_map = array("Jan" => 1, "Feb" => 2, "Mar" => 3, "Apr" => 4, "May" => 5, "Jun" => 6, "Jul" => 7, "Aug" => 8, "Sep" => 9, "Oct" => 10, "Nov" => 11, "Dec" => 12);

function date_compare($a, $b) {
  global $date_map;

  $a_month = $date_map[substr($a, 0, 3)];
  $b_month = $date_map[substr($b, 0, 3)];

  if ($a_month == $b_month) return 0;
  return ($a_month > $b_month) ? 1 : -1;
}

uksort で date_compare を使用する

于 2012-07-10T01:38:48.480 に答える
0

キーの ' を「20」に置き換える必要があります

http://codepad.org/sNv9QRtg

これは、いくつかのテスト コードを使用した実用的な例です。

$values = array
(
    "Jun '12" => 2037,
    "May '12" => 4615,
    "Apr '12" => 4175,
    "Mar '12" => 4548,
    "Feb '12" => 2758,
    "Jan '12" => 3077,
    "Jul '12" => 0
);

//I tried uksort with this callback function with no such luck.

function datediff($a, $b) {
     strtotime($a);
    $a = date('U',strtotime(str_replace("'", "20", $a)));
    $b = date('U',strtotime(str_replace("'", "20", $b)));

    if ($a == $b) $r = 0;
    else $r = ($a > $b) ? 1: -1;

    return $r;
}

foreach($values as $key=>$val) {
    echo $key . " = " . strtotime(str_replace("'", "20", $key)) . "\n";
}

// before
print_r($values);

uksort($values, "datediff");

// after
print_r($values);
于 2012-07-10T01:32:41.667 に答える
0

strtotime()は 12 の前の一重引用符を認識しないため、datediff() は常に 0 を返します。したがって、$a と $b は空です (したがって等しい)

したがって、可能であれば、「Mar '12」ではなく「Mar 12」のようなものをキーとして使用する必要があります。それ以外の場合は、 strtotime()を呼び出す前に、 datediffに何らかの文字列操作を追加する必要があります。

于 2012-07-10T01:33:22.583 に答える