如何使用PHP glob()与最小文件日期(filemtime)?

9rnv2umw  于 2023-10-15  发布在  PHP
关注(0)|答案(4)|浏览(122)

我想用PHP glob函数获取一系列文件,但不超过一个月(或其他指定的日期范围)。
当前代码:

$datetime_min = new DateTime('today - 4 weeks');

$product_files = array();
foreach(glob($image_folder.$category_folder.'*'.$img_extension) as $key => $product) if (filemtime($product)>$datetime_min) { $product_files[] = $product; }

这将返回一个错误:
注意:DateTime类的对象无法转换为int
我想它仍然会给我一个结果,所有文件在该文件夹中。所以我的方法可能是完全错误的。
我如何才能使这段代码工作,所以我只有一个数组,其中的文件不超过指定的日期?

zysjyyx4

zysjyyx41#

filemtime()返回一个整数的Unix时间戳。DateTime对象是可比较的,但仅限于彼此之间。您需要将它们转换为Unix时间戳,或者将filemtime()的结果转换为DateTime对象。
选项1:

$datetime = (new DateTime('now'))->format('U');
$datetime_min = (new DateTime('today - 4 weeks')->format('U');

备选方案二:

$filetime = new DateTime(@filemtime($product));
if (filetime > $datetime_min) {}
xnifntxz

xnifntxz2#

试试这个剧本

<?php

$to = date("Y-m-d H:i:s");
$from = date('Y-m-d H:i:s', strtotime("-100 days"));

getAllFilesInDirectoryWithDateRange("*.*", $sdf, $today);

function getAllFilesInDirectoryWithDateRange($filePattern, $from, $to) {
    foreach (glob($filePattern) as $filename) {
        if (date("Y-m-d H:i:s", filemtime($filename)) >= $from &&
            date("Y-m-d H:i:s", filemtime($filename)) <= $to) {
                echo "$filename" . "\n";
        }
    }
}

输出

test1.txt
test2.txt
test3.txt
test4.txt
test5.txt

您可以使用getAllFilesInDirectoryWithDateRange函数并获取目录中的所有文件名
在这个函数中,我使用filemtime来获取时间,然后像这样检查阈值

date("Y-m-d H:i:s", filemtime($filename)) >= $from && 
date("Y-m-d H:i:s", filemtime($filename)) <= $to
lb3vh1jj

lb3vh1jj3#

您可以使用array_filter()解决此问题。

$tsLimit = strtotime('-2 Month');
$file_pattern = ..//your file pattern

$files = array_filter(
  glob($file_pattern), 
  function($val) use($tsLimit){
    return filemtime($val) > $tsLimit;
  }
);
chhqkbe1

chhqkbe14#

不要使用glob,获取你永远不会使用的结果是低效的,特别是当目录很大的时候。
请尝试:

exec("find $filePath -mtime -$days | rev | cut -d/ -f1 | rev", $results);

因为我们并不总是知道路径分隔符的数量,所以使用cut和rev,文件总是第一个条目。

相关问题