2013-07-21 36 views
0

我很困惑,我尝试了很多相关的方法来对可能具有不同格式的日期数组进行排序。使用asort对日期数组进行排序()

我有日期的数组,例如:

"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)包含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; 

} 

可有人请给我解释一下什么是错的...

感谢

+0

没有人?不知道? –

+0

下来投票,但没有真正严重的意见! –

+0

@tlenss - 您的答案不正确,我再次测试一遍,以确保您的答案,并且您没有提供完整的答案。在LukášB回答并进行了一些测试后,很明显strtotime()不能处理不使用4位数字的日期(使用。或 - ),同样使用一位数月份和日期使得它不那么可靠,所以技巧部分是像Lukas一样将日期解析为'dd.mm.Y'或'dd-mm-Y',这是使用'strtotime()'对给定数组执行此操作的唯一方法。我很抱歉,但你的答案并不完整,也不是那么真实,但我很欣赏它,所以玩得开心。 –

回答

0

出于某种原因,欧洲 - 98没有工作,所以我推荐编辑一年四位数字格式:

function sortArrays_ByDate($target){ 

     foreach($target as $key_s => $val_s) { 
      $day = substr($val_s, 0, strpos($val_s, '.')); 
      $month = substr($val_s, strpos($val_s, '.')+1, strrpos($val_s, '.')-strpos($val_s, '.')-1); 
      $year = substr($val_s, strrpos($val_s, '.')+1); 

      if($year > 79 && $year <= 99) 
       $year = "19" . $year; 
      elseif($year >=00 && $year <= 79) 
       $year = "20" . $year; 

      $target[(string)$key_s] = strtotime($day .'.'. $month .'.'. $year); 
     } 

     asort($target); 

     /*foreach($target as $value) 
      echo date("d.m.Y", $value) . '</br>'; 
     changed for edit time to d.m.Y -> 
     */ 

     foreach($target as $key_s => $val_s) 
     $target[(string)$key_s] = date("d.m.Y", $target[(string)$key_s]); 

     return $target; 
} 

然后它对我有效,数组我排序正确。

编辑//

结果是:

Array 
(
    [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 
) 
Array 
(
    [6] => 12.09.1998 
    [3.1] => 23.04.2010 
    [4] => 28.09.2012 
    [2.0] => 28.09.2012 
    [2.1] => 29.09.2012 
    [2.2] => 29.09.2012 
    [1] => 02.10.2012 
    [3] => 09.10.2012 
    [0] => 09.10.2012 
    [5] => 26.10.2012 
    [6.0] => 05.03.2013 
    [6.1] => 23.04.2013 
    [2] => 27.09.2015 
) 
+0

终于,欢迎到这个网站,谢谢!所以我不愚蠢有这个98的问题???这里是你的第一声望.... –

+0

谢谢你欢迎我。我不知道为什么,但是当我使用 - 作为分隔符时,它返回错误98和其他一些错误的结果。 –

+0

是否有这个“98”问题的原因?根据文档strtotime应处理d.m.yy和其他组合 –