2012-10-08 63 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手冊條目寫此解決方案: