按日期排序数组键

时间:2012-07-10 01:21:15

标签: php

如何使用键

按日期对此数组进行排序
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;
}

感谢任何帮助。 谢谢!

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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);

答案 2 :(得分:0)

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

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