【问题标题】:Need Help Sorting Array with Timestamp in PHP需要帮助在 PHP 中使用时间戳对数组进行排序
【发布时间】:2016-09-12 22:07:50
【问题描述】:

在发布这篇文章之前,我已经完成了相当一部分的研究,现在我需要一个正确的方向。我有一个网络摄像机文件名列表。文件名是我需要排序的时间戳本身。我不知道如何对字符串名称上的日期进行排序。我想我需要将字符串转换为函数 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' );

感谢任何建议。努力学习。

【问题讨论】:

  • 是否必须按文件名(包括 SNAP_CH04...)或仅按时间戳部分排序?如果只是文件名,您应该可以使用sort($array) 或natsort($array)
  • 需要按时间戳部分排序。
  • 那你可能需要查看usort()
  • natsort($array) 将不起作用,因为我不希望 SNAP_CH04... 排序。自然排序倾向于对频道编号进行排序。

标签: php arrays sorting timestamp


【解决方案1】:

只要您可以对名称中包含的“SNAP_CH_04”部分进行排序,您就可以使用sort() 对数组进行排序,而无需进行任何转换。

sort($array);

如果你需要去掉那部分,你可以使用substr然后sort(),像这样:

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

sort($array);

【讨论】:

  • 1.您使用的范围不会修改原始数组,仅修改 foreach, 2 中的 $a 变量。这会对原始数组进行排序,并且不提供对原始文件名的引用。更改文件名对任何人都没有好处。
  • 你说得对,我一发布原始答案就看到了。我将其更改为修改数组然后对其进行排序,但我认为这也可能不是最好的方法。 usort() 可能是去这里的最佳方式。
  • 是的,上面的 foreach 破坏了原始数组而不对其进行排序。 ://
  • 仅供参考 foreach ($array as &amp;$a) 也可以,您只需要使用参考
  • 你知道,这很有趣。回答别人的问题和问自己的问题一样多,甚至更多,哈哈。
【解决方案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);
});

【讨论】:

  • 那么你的函数是如何工作的呢?它将第一个存储项与数组中的第二个存储项进行比较,然后 strcmp() 比较字符串?
  • @NewbTechGuy 该函数从第一项和第二项中剥离前 10 个字符,然后调用 strcmp 进行比较。每次需要在排序算法中对两个项目进行排序时,都会调用此函数。
  • @NewbTechGuy 如果第一项小于第二项,则自定义函数应该返回 -1,如果它们相等,则返回 0,如果第二项大于第一项,则返回 1。由于 strcmp 已经这样做了,我只需要在删除我们不需要的字符后调用该函数。
  • @NewbTechGuy 需要注意的一点是,此代码假定频道号部分的长度始终为 10 个字符(包括第二个下划线)。
猜你喜欢
  • 1970-01-01
  • 2021-11-08
  • 2015-06-28
  • 2014-06-29
  • 2011-04-15
  • 2019-12-25
  • 1970-01-01
  • 1970-01-01
  • 2015-11-27
相关资源
最近更新 更多