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
  • 数组
    $ytdCommissions
    未正确生成以使用usort-请查看上面的示例

    • 这很烦人,但似乎没有其他办法

      下面是我能算出的最短代码:

      <?
      $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
      )