按照中间字符串时间戳对文件名数组进行自然排序

问题描述 投票:0回答:3

在发布此内容之前,我已经做了相当多的研究,现在我需要在正确的方向上提供帮助。我有一个 ip 摄像机文件名列表。文件名是我需要排序的时间戳本身。我不知道如何对字符串名称上的日期进行排序。我想我需要将字符串转换为函数的可读格式

strtotime()
?或者有没有不改变字符串的方法?我不知道如何正确解决这个问题。

我已经尝试过

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' );
php arrays sorting timestamp filenames
3个回答
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
投票

只要您可以对名称中包含的“SNAP_CH_04”部分进行排序,您就可以使用

sort()
对数组进行排序,无需进行任何转换。

sort($array);

如果需要删除该部分,可以使用

substr
然后使用
sort()
,如下所示:

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

sort($array);

0
投票

无论您选择使用哪种处理技术来生成可移植值,您都应该尽可能少地进行这些操作。 使用

usort()
将在每次迭代中执行两次该技术(并且排序时永远不会少于 N 次迭代。

相反,只需对每个元素执行一次数据准备技术,然后简单地对值进行排序。 对于这种性能改进,

array_multisort()
是理想的选择。 演示

array_multisort(
    array_map(fn($v) => substr($v, 10), $array),
    SORT_DESC,
    SORT_NATURAL,
    $array
);
var_export($array);

其他策略可能会实现

preg_replace()
sscanf()
substr_replace()
explode()
或其他方法来隔离可排序子字符串。

© www.soinside.com 2019 - 2024. All rights reserved.