PHP按自定义顺序对工作日和月份-年份数组进行排序
Posted
技术标签:
【中文标题】PHP按自定义顺序对工作日和月份-年份数组进行排序【英文标题】:PHP sort weekday and month-year array by custom order 【发布时间】:2013-07-16 13:44:11 【问题描述】:我有一系列工作日(见下文),我想将它们分类为“周一-周二-周三-周四-周五-周六-周日”。
"Sun"=>59
"Sat"=>41
"Fri"=>21
"Thu"=>11
"Wed"=>14
"Tue"=>19
"Mon"=>31
我尝试了以下代码,但它似乎无法正常工作,结果是上面粘贴的有序数组,即不是我想要的顺序。
function orderbyweekday($a, $b)
if (strcmp($a, "Mon") == 0)
$a = 0;
else if (strcmp($a, "Tue") == 0)
$a = 1;
else if (strcmp($a, "Wed") == 0)
$a = 2;
else if (strcmp($a, "Thu") == 0)
$a = 3;
else if (strcmp($a, "Fri") == 0)
$a = 4;
else if (strcmp($a, "Sat") == 0)
$a = 5;
else if (strcmp($a, "Sun") == 0)
$a = 6;
if (strcmp($b, "Mon") == 0)
$b = 0;
else if (strcmp($b, "Tue") == 0)
$b = 1;
else if (strcmp($b, "Wed") == 0)
$b = 2;
else if (strcmp($b, "Thu") == 0)
$b = 3;
else if (strcmp($b, "Fri") == 0)
$b = 4;
else if (strcmp($b, "Sat") == 0)
$b = 5;
else if (strcmp($b, "Sun") == 0)
$b = 6;
// if same day, return 0
if ($a == $b)
return 0;
return ($a > $b) ? -1 : 1;
uksort($movies_per_day, "orderbyweekday");
我也想对一系列月份年份做类似的事情(例如“2010 年 6 月”=>10、“2009 年 5 月”=>111 等),但是一旦我做对了,它应该是更容易。
非常感谢。
【问题讨论】:
【参考方案1】:你可以试试这个。
function weekdaySort($a, $b)
$weekdays = array("Mon", "Tue","Wed","Thu","Fri", "Sat", "Sun");
return array_search($a, $weekdays) - array_search($b, $weekdays);
uksort($movies_per_day, "weekdaySort");
或者如果你使用的是 php 5.3 或更高版本,你可以使用闭包;
$weekdays = array("Mon", "Tue","Wed","Thu","Fri", "Sat", "Sun");
uksort($movies_per_day, function($a, $b) use ($weekdays) return array_search($a, $weekdays) - array_search($b, $weekdays););
这将避免在每次迭代时重新创建 $weekdays
数组。
【讨论】:
太好了,它有效!我仍然不明白我做错了什么,但没关系。谢谢! 我认为原来的错误可以通过将return ($a > $b) ? -1 : 1;
更改为return ($a < $b) ? -1 : 1;
来解决【参考方案2】:
我建议将数组键更改为计算机可读(和可排序)的东西,所以使用数字作为键:
$days = array(6=>59,5=>41,4=>21,3=>11,2=>14,1=>19,0=>31);
然后您可以按以下方式对日期进行排序:
ksort($days);
至少对于像“2010 年 6 月”这样的困难键,几乎不可能对数组进行排序。
您可以使用像 $key = year*12+month;
这样的键来获得可排序的索引。 “2010 年 6 月”可以写为 24125 (2010*12+5),如果您使用 0 表示一月。
或者使用一个月第一天的时间戳:
$key = mktime(0,0,0,6,1,2010);
如果您想在某天获得每日报告,这会更加灵活。
【讨论】:
【参考方案3】:接受有点晚了,但一个优点是这将适用于其他语言的日子,因为它使用 PHP 的日期/时间处理
$days = array(
"Sun"=>59,
"Sat"=>41,
"Fri"=>21,
"Thu"=>11,
"Wed"=>14,
"Tue"=>19,
"Mon"=>31,
);
uksort($days, function($a, $b)
$c = date_diff(new DateTime('@' . strtotime($a, strtotime('Mon', 0))), new DateTime('@' . strtotime($b, strtotime('Mon', 0))));
return $c->invert ? 1 : -1;
);
对于这样一个简单的任务来说,它似乎不必要地复杂,我相信有更好的方法!
【讨论】:
【参考方案4】:此方法需要 PHP > 5.3:
$arr = array("Sun"=>59, "Thu"=>11, "Sat"=>41, "Fri"=>21, "Tue"=>19, "Wed"=>14, "Mon"=>31);
$ord = array_flip(array('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'));
uksort($arr, function ($a, $b) use($ord)
return $ord[$a] - $ord[$b];
);
var_dump($arr);
【讨论】:
以上是关于PHP按自定义顺序对工作日和月份-年份数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章
如何按自定义顺序对 JavaScript 中的数组进行排序? [复制]