如何使用键
按日期对此数组进行排序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;
}
感谢任何帮助。 谢谢!
答案 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"
在您的密钥中这应该是一些带有一些测试代码的工作示例。
$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 中添加某种字符串操作。