首页 > 解决方案 > 使用scandir获取按时间排序的文件名

问题描述

我正在创建文件并将其名称设置为time()使用md5函数的散列表示:

$encoded_data = ['some_data'];
$file_name = md5(time()).'.json';
$path = base_path("../some_folder/");
file_put_contents($path.$file_name, $encoded_data); 

我不明白的是,如果我使用scandir排序顺序参数来获取这些文件:

foreach(array_diff(scandir($path, 1), ['.', '..']) as $file_name) {
    $files[] = base_path('../some_folder/').$file_name;
}

数组真的会$files按用作文件名的日期和时间排序吗?

标签: php

解决方案


由于像 md5 这样的散列函数只是单向的,因此文件名作为排序标准是无用的。如果您想跟踪用于生成 md5 值的相同时间戳,则必须记录一个 hash:timestamp 表。如果你这样做了,你就不需要运行scandir——你可以简单地从你保存的参考表中读取文件列表。(假设您使用已删除的文件使其保持最新状态。否则,它将显示过时的文件。)

是否有特殊原因需要使用时间戳的 md5 哈希?为什么不简单地使用时间戳(带有前缀或其他)作为文件名?然后,您可以简单地按字母顺序、升序或降序排序,并自动按时间顺序排列文件。这将是迄今为止最简单和最轻量级的选择。

如果必须使用 md5-hashes 作为文件名,并且您不喜欢编写参考表,那么您将不得不遍历文件,或者使用usort,并检查文件的创建/修改日期 ( filemtime)。您可以在 PHP 中按日期对文件进行排序的答案中找到解决方案。请注意,这将导致更多的磁盘活动(即使结果被缓存)。


推荐阅读