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;
}

使用 date_compare 和 uksort

于 2012-07-10T01:38:48.480 回答
0

datediff()总是返回0,因为strtotime()不理解 12 前面的单引号。因此,$a 和 $b 为空(因此相等)。

因此,如果可能的话,您应该使用“Mar 12”之类的东西作为您的密钥,而不是“Mar '12”。否则,您必须在调用strtotime()之前在datediff中添加某种字符串操作。

于 2012-07-10T01:33:22.583 回答
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 回答