2016-05-17 32 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