2016-05-17 36 views
2

在發佈之前,我已經完成了我的公平份額研究,現在我需要一個正確的方向。我有一個ip攝像頭文件名列表。文件名是我需要排序的時間戳本身。我無法弄清楚如何對字符串名稱的日期進行排序。我想我需要將字符串轉換爲函數strtotime()的可讀格式?或者有沒有辦法改變字符串?我不知道如何正確處理這個問題。需要幫助使用PHP中的時間戳對數組進行排序

我試過array_multisort($array, SORT_DESC, SORT_NUMERIC);沒有運氣。

$array = Array ('SNAP_CH04_2016_05_15_18_11_05_62777.jpg', 'SNAP_CH01_2016_05_15_18_05_38_63588.jpg', 'SNAP_CH02_2016_05_15_18_05_13_38387.jpg', 'SNAP_CH04_2016_05_15_15_55_28_52502.jpg', 'SNAP_CH04_2016_05_15_14_52_46_26039.jpg', 'SNAP_CH03_2016_05_15_14_52_39_18421.jpg', 'SNAP_CH04_2016_05_15_14_51_34_19005.jpg', 'SNAP_CH02_2016_05_15_14_51_25_9874.jpg', 'SNAP_CH04_2016_05_15_06_12_49_23707.jpg', 'SNAP_CH04_2016_05_15_05_03_09_38176.jpg', 'SNAP_CH04_2016_05_15_03_33_27_29791.jpg', 'SNAP_CH03_2016_05_15_01_59_29_27941.jpg'); 

任何意見是讚賞。試圖學習。

+0

是否必須由文件名(包括SNAP_CH04進行排序。 ..)或只是時間戳部分?如果只是文件名,你應該只能使用'sort($ array)'或'natsort($ array)' –

+0

它需要按照時間戳部分進行排序。 – NewbTechGuy

+0

然後你可能需要查看['usort()'](https://secure.php.net/manual/en/function.usort.php) –

回答

2

可以使用usort功能,讓您自定義一個函數來比較字符串。這裏是如何可以工作:

<?php 

function timestamp_cmp($a, $b) { 
    $first = substr($a, 10); 
    $second = substr($b, 10); 
    return strnatcmp($first, $second); 
} 
$array = Array ( 
    'SNAP_CH04_2016_05_15_18_11_05_62777.jpg', 
    'SNAP_CH01_2016_05_15_18_05_38_63588.jpg', 
    'SNAP_CH02_2016_05_15_18_05_13_38387.jpg', 
    'SNAP_CH04_2016_05_15_15_55_28_52502.jpg', 
    'SNAP_CH04_2016_05_15_14_52_46_26039.jpg', 
    'SNAP_CH03_2016_05_15_14_52_39_18421.jpg', 
    'SNAP_CH04_2016_05_15_14_51_34_19005.jpg', 
    'SNAP_CH02_2016_05_15_14_51_25_9874.jpg', 
    'SNAP_CH04_2016_05_15_06_12_49_23707.jpg', 
    'SNAP_CH04_2016_05_15_05_03_09_38176.jpg', 
    'SNAP_CH04_2016_05_15_03_33_27_29791.jpg', 
    'SNAP_CH03_2016_05_15_01_59_29_27941.jpg' 
); 

usort($array,'timestamp_cmp'); 

注:如果您對PHP 5.3+,你可以這樣做:

usort($array,function($a, $b) { 
    $first = substr($a, 10); 
    $second = substr($b, 10); 
    return strnatcmp($first, $second); 
}); 
+0

那麼你的功能如何工作?它將第一個存儲的項目與數組中的第二個存儲項目進行比較,然後strcmp()比較字符串? – NewbTechGuy

+0

@NewbTechGuy該函數從第一項和第二項中剝離前10個字符,然後調用strcmp進行比較。每次需要在排序算法中排序兩個項目時,都會調用該函數。 –

+0

@NewbTechGuy如果第一項小於第二項,自定義函數應該返回-1,如果它們相等,則返回0;如果第二項大於第一項,則返回1。由於strcmp已經做到了,我只需要在刪除不需要的字符後調用該函數。 –

1

只要您對名稱中包含的「SNAP_CH_04」部分進行排序即可,您只需使用sort()即可對陣列進行排序,無需進行任何轉換。

sort($array); 

如果需要剝離的那部分,你可以使用substr然後sort(),像這樣:

for ($a = 0; $a < count($array); $a++) 
{ 
    $array[$a] = substr($array,10); 
} 

sort($array); 
+0

1.您使用的範圍不會修改原始數組,只能修改'foreach'中的'$ a'變量,2.這會對原始數組進行排序,並且不會返回原始文件名。更改文件名對任何人都沒有好處。 –

+0

你說得對,當我發佈原始答案時我就看到了。我改變它來修改數組然後對其進行排序,但我認爲這可能不是最好的方法。 'usort()'可能是最好的方法。 –

+0

是的,上面的foreach破壞了原始數組而沒有對它進行排序。 :/ – NewbTechGuy