php - 使用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
按用作文件名的日期和时间排序吗?
解决方案
由于像 md5 这样的散列函数只是单向的,因此文件名作为排序标准是无用的。如果您想跟踪用于生成 md5 值的相同时间戳,则必须记录一个 hash:timestamp 表。如果你这样做了,你就不需要运行scandir
——你可以简单地从你保存的参考表中读取文件列表。(假设您使用已删除的文件使其保持最新状态。否则,它将显示过时的文件。)
是否有特殊原因需要使用时间戳的 md5 哈希?为什么不简单地使用时间戳(带有前缀或其他)作为文件名?然后,您可以简单地按字母顺序、升序或降序排序,并自动按时间顺序排列文件。这将是迄今为止最简单和最轻量级的选择。
如果必须使用 md5-hashes 作为文件名,并且您不喜欢编写参考表,那么您将不得不遍历文件,或者使用usort
,并检查文件的创建/修改日期 ( filemtime
)。您可以在 PHP 中按日期对文件进行排序的答案中找到解决方案。请注意,这将导致更多的磁盘活动(即使结果被缓存)。
推荐阅读
- java - CWNEN0030E 在 Websphere Liberty 中查找数据源 JNDI 时出错
- python-3.x - 检查整数是否只包含奇数
- python - 从用户输入创建对象
- python - 格式问题
- java - 解析列表时出现 JsonMappingException
- html - Tailwindcss 不适用于 NextJS 链接标签
- google-cloud-platform - 如何将 DCM 标准报告展示次数与 Big Query 的拉取匹配?
- flutter - 小部件不会与其他小部件重叠
- sql-server - SSRS - 使用分页符/按元素分组修改 PageName
- google-apps-script - Google Apps 脚本 GET 和 POST 控制器不适用于 IoT 设备 (ESP32)