【发布时间】:2013-07-20 09:30:09
【问题描述】:
我真的很困惑,我尝试了很多相关的方法来对可能具有不同格式的日期数组进行排序。
我有一个日期数组,例如:
"0"=>"09.10.2012"
"1"=>"02.10.12"
"2"=>"27.09.15"
"2.0"=>"28.09.2012"
"2.1"=>"29.9.2012"
"2.2"=>"29.09.2012"
"3"=>"9.10.2012"
"3.1"=>"23.4.10"
"4"=>"28.09.2012"
"5"=>"26.10.2012"
"6"=>"12.09.98"
"6.0"=>"05.03.2013"
"6.1"=>"23.4.2013"
(键是字符串是有原因的)
现在我知道它们将采用相同的格式顺序 - 日、月、年。但是数字可以改变,正如你在给定的数组中看到的那样。
我基本上将它们解析为日-月-年(strtotime() 根据文档识别的欧洲格式),然后将它们更改为 Unix 时间戳,我正在使用 asort() 对数组进行排序,但我收到了错误结果:
[6]->[] -- 12.09.98
[1]->[1034380800] -- 02.10.12
[2.0]->[1348790400] -- 28.09.2012
[4]->[1348790400] -- 28.09.2012
[2.2]->[1348876800] -- 29.09.2012
[2.1]->[1348876800] -- 29.9.2012
[3]->[1349740800] -- 9.10.2012
[0]->[1349740800] -- 09.10.2012
[5]->[1351209600] -- 26.10.2012
[6.0]->[1362441600] -- 05.03.2013
[6.1]->[1366675200] -- 23.4.2013
[3.1]->[1681084800] -- 23.4.10
[2]->[1820966400] -- 27.09.15
如您所见,[6](unixtime) 包含 False 并且 strtotime() 无法转换日期。
这是我的代码:
function sortArrays_ByDate($target){
foreach($target as $key_s => $val_s) { $date_exp = preg_replace('#(\.|_)#','-',$val_s); $target[(string)$key_s] = $date_exp; }
foreach($target as $key_s => $val_s) { $date_exp = strtotime($val_s); $target[(string)$key_s] = $date_exp; }
asort($target);
return $target;
}
谁能帮我解释一下怎么回事……
谢谢
【问题讨论】:
-
投了反对票,但没有真正严重的 cmets!
-
@tlens - 你的答案不正确,我再次测试它只是为了确定,你也没有提供完整的答案。在 Lukáš B 回答和更多测试之后,
strtotime()显然无法处理不使用 4 位数年份的日期(使用 . 或 - ),也使用一位数月份和日期使其不那么可靠,因此技巧部分是解析日期到dd.mm.Y或dd-mm-Y就像 Lukas 所做的那样,这是使用strtotime()对给定数组执行此操作的唯一方法。很抱歉,您的回答并不完整,也不那么真实,但无论如何我都很感激,所以请尽情享受投票吧。 -
顺便说一下,在本网站中投票是针对不完整的问题和未显示任何研究努力的问题 - 不是针对用户的喜欢或不喜欢的态度。
标签: php sorting strtotime asort