我有一大堆的文件,這些文件是在一個數組排序PHP數組按日期
im(month)(day)(year)
im01012007
im01022006
im01022012
im01032011
im01042010
im01042012
im01052009
im01052011
im01062012
im01072008
im01072011
等。
是有辦法對數組進行排序,以便它通過年份排序,然後再一個月天?
我有一大堆的文件,這些文件是在一個數組排序PHP數組按日期
im(month)(day)(year)
im01012007
im01022006
im01022012
im01032011
im01042010
im01042012
im01052009
im01052011
im01062012
im01072008
im01072011
等。
是有辦法對數組進行排序,以便它通過年份排序,然後再一個月天?
您可以嘗試使用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)
痛苦地緩慢......不需要爲每個比較創建日期時間對象。一個簡單的子字符串提取/重新排列到yyyymmdd和直接字符串比較將會更快。 –
@Marc B直接字符串不會與日期.....除非日期重新排列...你有什麼建議? – Baba
是的。首先將其轉換爲合理的格式。
我建議使用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;
});
希望有所幫助。
使用substr()
並將您的字符串劃分爲單元(日,月,年)。然後你可以對它們進行排序
沒有內置的功能會做到這一點的開箱,我會用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));
});
這將排序最舊到最新。使用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手冊條目寫此解決方案:
最簡單的辦法就是讓他們在YYMMDD格式,這自然會自行解決到日期爲重命名。 –