Php 按月份排序数组
可能重复:Php 按月份排序数组,php,Php,可能重复: 我有一个这样的数组 Array ( [May] => 10904 [Jan] => 9269 [Jun] => 3743 [Feb] => 3507 [Mar] => 6017 [Apr] => 4966 ) 我怎样才能按月份分类呢。一月、二月、三月等 我试过了,但运气不好 $ytdCommissions = array_flip($ytdCommissions); usort($ytdCommissions,'monthCompare');
我有一个这样的数组
Array
(
[May] => 10904
[Jan] => 9269
[Jun] => 3743
[Feb] => 3507
[Mar] => 6017
[Apr] => 4966
)
我怎样才能按月份分类呢。一月、二月、三月等
我试过了,但运气不好
$ytdCommissions = array_flip($ytdCommissions);
usort($ytdCommissions,'monthCompare');
function monthCompare($a, $b)
{
$months = array('JAN' => 1, 'FEB' =>2,'MAR' => 3,'APR' => 4,'MAY' => 5,'JUN' => 6,'JULY' => 7,'AUG' => 8, 'SEP' => 9, 'OCT' => 10, 'NOV' => 11, 'DEC' => 12);
if($a == $b)
{
return 0;
}
return ($months[$a] > $months[$b]) ? 1 : -1;
}
谢谢 尝试制作一个月数组,如下所示:
$months = array("Jan", "Feb", "March", "etc...");
然后为每个月分配您喜欢的值:
$months[0] = 9269; // Jan
$months[2] = 6017; // March
然后月份就是$months
数组的键,$months[0]
是一月,$months[11]
是十二月。1。)在排序键时需要使用uksort
2.)您应该比较大写键以匹配月份数组:
$a = strtoupper($a);
$b = strtoupper($b);
您使用的排序是值排序。应该使用uksort。还删除了您构建的阵列,因为我认为它是多余的:
$arr = array(
"May" => 10904,
"Jan" => 9269,
"Jun" => 3743,
"Feb" => 3507,
"Mar" => 6017,
"Apr" => 4966,
);
uksort($arr,'monthCompare');
var_dump($arr);
function monthCompare($a, $b)
{
//$months = array('JAN' => 1, 'FEB' =>2,'MAR' => 3,'APR' => 4,'MAY' => 5,'JUN' => 6,'JULY' => 7,'AUG' => 8, 'SEP' => 9, 'OCT' => 10, 'NOV' => 11, 'DEC' => 12);
$aMonth = date("m", strtotime($a));
$bMonth = date("m", strtotime($b));
if($a == $b)
{
return 0;
}
return ($aMonth > $bMonth) ? 1 : -1;
}
- 在
$ytdCommissions
- 数组
未正确生成以使用usort-请查看上面的示例$ytdCommissions
- 这很烦人,但似乎没有其他办法
下面是我能算出的最短代码:
<?
$months[May] = 10904;
$months[Jan] = 9269;
$months[Jun] = 3743;
$months[Feb] = 3507;
$months[Mar] = 6017;
$months[Apr] = 4966;
for($m=1;$m<=12;$m++)
{
$m_index[date("M",mktime(0,0,0,$m,1,2000))] = $m;
}
foreach($months as $i => $v)
{
$months_out[$m_index[$i]] = $v;
}
ksort($months_out);
print_r($months_out);
?>
如果您有一个关联数组,则实际上不需要对其进行排序。您可以按顺序使用密钥进行迭代。正如Will所说,您不需要对其进行排序。除了创建一个新函数外,您还可以创建一个新数组,对月份进行排序,然后进行合并。无论你的解决方案是什么-它应该是O(n)你的解决方案比我的+1更优雅
$data = array(
'May' => 10904,
'Jan' => 9269,
'Jun' => 3743,
'Feb' => 3507,
'Mar' => 6017,
'Apr' => 4966,
);
$sort = array('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
uksort($data,
function($value1, $value2) use ($sort) {
return array_search($value1,$sort) > array_search($value2,$sort);
}
);
var_dump($data);
<?
$months[May] = 10904;
$months[Jan] = 9269;
$months[Jun] = 3743;
$months[Feb] = 3507;
$months[Mar] = 6017;
$months[Apr] = 4966;
for($m=1;$m<=12;$m++)
{
$m_index[date("M",mktime(0,0,0,$m,1,2000))] = $m;
}
foreach($months as $i => $v)
{
$months_out[$m_index[$i]] = $v;
}
ksort($months_out);
print_r($months_out);
?>
Array
(
[1] => 9269
[2] => 3507
[3] => 6017
[4] => 4966
[5] => 10904
[6] => 3743
)