2012-10-08 105 views
1

我有一大堆的文件,这些文件是在一个数组排序PHP数组按日期

im(month)(day)(year) 

im01012007 

im01022006 

im01022012 

im01032011 

im01042010 

im01042012 

im01052009 

im01052011 

im01062012 

im01072008 

im01072011 

等。

是有办法对数组进行排序,以便它通过年份排序,然后再一个月天?

+0

最简单的办法就是让他们在YYMMDD格式,这自然会自行解决到日期为重命名。 –

回答

1

您可以尝试使用usort

$string = "im01012007.jpg,im01022006.jpg,im01022012.jpg,im01032011.jpg,im01042010.jpg,im01042012.jpg,im01052009.jpg,im01052011.jpg,im01062012.jpg,im01072008.jpg,im01072011.jpg"; 
$array = explode(",", $string); // rebulding your array ; 

var_dump($array); 

usort($array, function ($a, $b) { 
    $a = DateTime::createFromFormat("mdY", substr(pathinfo($a, PATHINFO_FILENAME), 2)); 
    $b = DateTime::createFromFormat("mdY", substr(pathinfo($b, PATHINFO_FILENAME), 2)); 
    return ($a == $b) ? 0 : (($a < $b) ? - 1 : 1); 
}); 

var_dump($array); 

输出

之前

array 
    0 => string 'im01012007.jpg' (length=14) 
    1 => string 'im01022006.jpg' (length=14) 
    2 => string 'im01022012.jpg' (length=14) 
    3 => string 'im01032011.jpg' (length=14) 
    4 => string 'im01042010.jpg' (length=14) 
    5 => string 'im01042012.jpg' (length=14) 
    6 => string 'im01052009.jpg' (length=14) 
    7 => string 'im01052011.jpg' (length=14) 
    8 => string 'im01062012.jpg' (length=14) 
    9 => string 'im01072008.jpg' (length=14) 
    10 => string 'im01072011.jpg' (length=14) 

array 
    0 => string 'im01022006.jpg' (length=14) 
    1 => string 'im01012007.jpg' (length=14) 
    2 => string 'im01072008.jpg' (length=14) 
    3 => string 'im01052009.jpg' (length=14) 
    4 => string 'im01042010.jpg' (length=14) 
    5 => string 'im01032011.jpg' (length=14) 
    6 => string 'im01052011.jpg' (length=14) 
    7 => string 'im01072011.jpg' (length=14) 
    8 => string 'im01022012.jpg' (length=14) 
    9 => string 'im01042012.jpg' (length=14) 
    10 => string 'im01062012.jpg' (length=14) 
+1

痛苦地缓慢......不需要为每个比较创建日期时间对象。一个简单的子字符串提取/重新排列到yyyymmdd和直接字符串比较将会更快。 –

+0

@Marc B直接字符串不会与日期.....除非日期重新排列...你有什么建议? – Baba

1

是的。首先将其转换为合理的格式。

我建议使用PHP的DateTime类,并在PHP程序中保留所有日期为DateTime对象。

如果你不想这样做,下面是一个按原样排序它们的函数。

usort($myDates, function($a, $b) { 
    $aBits = array_chunk($a,2); 
    $bBits = array_chunk($a,2); 
    $aDate = $aBits[3].$aBits[4].$aBits[2].$aBits[1]; 
    $bDate = $aBits[3].$aBits[4].$aBits[2].$aBits[1]; 
    return ($aDate < $bDate) ? -1 : 1; 
}); 

希望有所帮助。

1

使用substr()并将您的字符串划分为单元(日,月,年)。然后你可以对它们进行排序

1

没有内置的功能会做到这一点的开箱,我会用usort这样的:

usort($files, function($a, $b) { 
    return strcmp(preg_replace('/^.*(\d{2})(\d{2})(\d{4})$/', '$3$1$2', $a), preg_replace('/^.*(\d{2})(\d{2})(\d{4})$/', '$3$1$2', $b)); 
}); 
1

这将排序最旧到最新。使用krsort将最新到最旧的排序。

$files = array(); 
if ($handle = opendir('/path/to/files')) { 
    while (false !== ($entry = readdir($handle))) { 
     if ($entry != "." && $entry != "..") { 
      $y = substr($entry, 6, 4); 
      $m = substr($entry, 2, 2); 
      $d = substr($entry, 4, 2); 
      $files[$y . $m . $d] = $entry; 
     } 
    } 
    closedir($handle); 
} 
ksort($files); 

我用这些PHP手册条目写此解决方案: