我正在创建文件,并使用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数组是否真的会按作为文件名的日期和时间进行排序?
发布于 2020-06-02 17:13:38
因为像md5这样的散列函数是单向的,所以文件名作为排序标准是无用的。如果要跟踪用于生成md5值的同一时间戳,则必须在记录中保留一个散列:时间戳表。如果这样做,您就不需要首先运行scandir --您只需从保存的引用表中读取文件列表。(假设您使用已删除的文件来更新它。否则,它将显示过时的文件。)
您是否需要使用时间戳的MD5-散列?为什么不简单地使用时间戳(前缀或其他)作为文件名?然后,您可以简单地按字母顺序、升序或降序排序,并按时间顺序自动获得文件。到目前为止,这将是最简单和最轻的选择。
如果md5-散列作为文件名是必须的,并且编写引用表不是您想要的,那么您必须遍历这些文件,或者使用usort,并检查文件的创建/修改(filemtime)日期。您可以在sort files by date in PHP的答案中找到解决方案。请注意,这将导致更多的磁盘活动(即使结果被缓存)。
https://stackoverflow.com/questions/62153674
复制相似问题