需要在PHP中帮助排序带有时间戳的数组吗
在发布这篇文章之前,我已经做了相当多的研究,现在我需要一个正确方向的帮手。我有一个ip摄像机文件名列表。文件名就是我需要排序的时间戳本身。我不知道如何在字符串名称上对日期排序。我想我需要将字符串转换为函数的可读格式需要在PHP中帮助排序带有时间戳的数组吗,php,arrays,sorting,timestamp,Php,Arrays,Sorting,Timestamp,在发布这篇文章之前,我已经做了相当多的研究,现在我需要一个正确方向的帮手。我有一个ip摄像机文件名列表。文件名就是我需要排序的时间戳本身。我不知道如何在字符串名称上对日期排序。我想我需要将字符串转换为函数的可读格式strotime()?或者有没有不改变字符串的方法?我不知道如何正确处理这个问题 我尝试了array\u multisort($array,SORT\u DESC,SORT\u NUMERIC)
strotime()
?或者有没有不改变字符串的方法?我不知道如何正确处理这个问题
我尝试了array\u multisort($array,SORT\u DESC,SORT\u 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' );
任何建议都将不胜感激。尝试学习。只要您对名称中包含的“SNAP_CH_04”部分的排序没有问题,就可以使用sort()
对数组进行排序,而无需进行任何转换
sort($array);
如果需要去除该零件,可以使用substr
然后sort()
,如下所示:
for ($a = 0; $a < count($array); $a++)
{
$array[$a] = substr($array,10);
}
sort($array);
for($a=0;$a
您可以使用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');
它必须按文件名(包括SNAP_CH04…)排序还是仅按时间戳部分排序?如果只是文件名,您应该能够只使用sort($array)
或natsort($array)
它需要按时间戳部分排序。然后您可能需要查看natsort($array)
将不起作用,因为我不想要快照。。。分类。自然排序倾向于对频道编号进行排序。您使用的作用域不修改原始数组,只修改foreach
中的$a
变量,2。这将对原始数组进行排序,并且不提供对原始文件名的引用。更改文件名对任何人都没有好处。你是对的,我一发布原始答案就看到了这一点。我修改了它来修改数组,然后对其进行排序,但我认为这可能也不是最好的方法usort()
可能是最好的方法。是的,上面的foreach在不排序的情况下销毁原始数组:/仅供参考,foreach($array as&$a)
也可以工作,您只需要使用引用,这很有趣。我通过回答别人的问题学到的东西和问自己的一样多,哈哈。那么你的函数是如何工作的呢?它将数组中的第一个存储项与第二个存储项进行比较,然后strcmp()比较字符串?@NewbTechGuy该函数从第一个和第二个存储项中去掉前10个字符,然后调用strcmp进行比较。每次需要在排序算法中对两个项进行排序时,都会调用此函数。@如果第一个项小于第二个项,则自定义函数应返回-1;如果它们相等,则为0;如果第二个项大于第一个项,则自定义函数应返回1。由于strcmp已经做到了这一点,我只需要在去掉不需要的字符后调用该函数。@newtechguy需要注意的一点是,该代码假定通道号部分的长度始终为10个字符(包括第二个下划线)。
usort($array,function($a, $b) {
$first = substr($a, 10);
$second = substr($b, 10);
return strnatcmp($first, $second);
});