Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要在PHP中帮助排序带有时间戳的数组吗_Php_Arrays_Sorting_Timestamp - Fatal编程技术网

需要在PHP中帮助排序带有时间戳的数组吗

需要在PHP中帮助排序带有时间戳的数组吗,php,arrays,sorting,timestamp,Php,Arrays,Sorting,Timestamp,在发布这篇文章之前,我已经做了相当多的研究,现在我需要一个正确方向的帮手。我有一个ip摄像机文件名列表。文件名就是我需要排序的时间戳本身。我不知道如何在字符串名称上对日期排序。我想我需要将字符串转换为函数的可读格式strotime()?或者有没有不改变字符串的方法?我不知道如何正确处理这个问题 我尝试了array\u multisort($array,SORT\u DESC,SORT\u NUMERIC)

在发布这篇文章之前,我已经做了相当多的研究,现在我需要一个正确方向的帮手。我有一个ip摄像机文件名列表。文件名就是我需要排序的时间戳本身。我不知道如何在字符串名称上对日期排序。我想我需要将字符串转换为函数的可读格式
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);
});