Возможный дубликат:
Функция сортировки массива в PHP
У меня такой массив
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; }
Благодаря!
1.) вам нужно использовать uksort
мере сортировки ключей
2.) вы должны сравнить прописные буквы, чтобы соответствовать вашему месячному массиву:
$a = strtoupper($a); $b = strtoupper($b);
Попробуйте сделать несколько месяцев:
$months = array("Jan", "Feb", "March", "etc...");
Затем для каждого месяца присваивайте им любые значения, которые вам нравятся:
$months[0] = 9269; // Jan $months[2] = 6017; // March
Тогда месяцы – это всего лишь ключи массива $months
, $months[0]
– январь и $months[11]
– декабрь .
Вы сортировали сортировку, которая предназначена для значений. Должен использовать 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; }
$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 )
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[0] == $b[0]) { return 0; } return ($months[$a[0]] > $months[$b[0]]) ? 1 : -1; } $ytdCommissions = array( array('MAY' , 10904), array('JAN' , 9269), array('JUN' , 3743), array('FEB' , 3507), array('MAR' , 6017), array('APR' , 4966) ); usort($ytdCommissions,'monthCompare'); print_r($ytdCommissions);
$months
: JAN
против Jan
on $ytdCommissions
$ytdCommissions
не построен правильно для использования usort – проверьте мой пример выше