PHP基于目录名的最旧路径

PHP基于目录名的最旧路径,php,shell-exec,spl,Php,Shell Exec,Spl,我的linux机器上有这样的文件夹树结构: /目录/yyyy/mm/dd/HH 例如。: /dir/2014/03/01/08 /dir/2014/03/20/09 /dir/2014/03/01/10 /dir/2014/08/01/10 /dir/2014/12/15/10 /dir/2015/01/01/14 我想在php中了解最古老的路径,如下所示: 最古老的路径是:2014-03-01 08 最新路径为:2015-01-01 14 如何做到这一点?它可以写得更好,但效果很好 $pat

我的linux机器上有这样的文件夹树结构: /目录/yyyy/mm/dd/HH 例如。: /dir/2014/03/01/08 /dir/2014/03/20/09 /dir/2014/03/01/10 /dir/2014/08/01/10 /dir/2014/12/15/10 /dir/2015/01/01/14

我想在php中了解最古老的路径,如下所示: 最古老的路径是:2014-03-01 08 最新路径为:2015-01-01 14


如何做到这一点?

它可以写得更好,但效果很好

 $paths = array(
                 '/dir/2014/03/01/08',
                 '/dir/2014/03/20/09',
                 '/dir/2014/03/01/10',
                 '/dir/2014/08/01/10',
                 '/dir/2014/12/15/10',
                 '/dir/2015/01/01/14',
 );

 $dates = array();

 foreach($paths as $path)
 {
     $matches = array();
     preg_match('#([^\/]+?)\/([^\/]+?)\/([^\/]+?)\/([^\/]+?)\/([^\/]+)#', $path, $matches);
     $dates[$path] = strtotime(sprintf("%s-%s-%s %s:00:00", $matches[2],      $matches[3], $matches[4], $matches[5]));
 }

 asort($dates);

 $dates = array_keys($dates);
 $oldest = array_shift($dates);
 $newest = array_pop($dates);

它将正则表达式查找的日期更改为unixtimestamp,然后对其进行排序,并返回排序数组的顶部和底部值。

有点像Pascal样式

<?php

$oldest = '';
$newest = '';
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator('./dir/'));
foreach ($iterator as $file => $object) {
    if ($iterator->getDepth() === 4) {
        $name = $object->getPath();
        if ($name > $newest) {
            $newest = $name;
        }
        if (empty($oldest) or $name < $oldest) {
            $oldest = $name;
        }
    }
}
var_export([$oldest, $newest]);

您所要做的就是循环遍历每个文件夹,找到编号最低的目录。如果将文件路径存储在数据库中,可能会更容易,但从您的问题来看,您似乎希望搜索文件夹

<?php

    $base = 'dir';
    $yearLowest = lowestDir($base);
    $monthLowest = lowestDir($yearLowest);
    $dayLowest = lowestDir($monthLowest);

    echo $dayLowest;

    function lowestDir($dir) {
        $lowest = null;
        $handle = opendir($dir);

        while(($name = readdir($handle))) {
            if($name == '.' || $name == '..') {
                continue;
            }

            if(is_dir($dir.'/'.$name) && ($lowest == null || $name < $lowest)) {
                $lowest = $name;
            }
        }

        closedir($handle);
        return $dir.'/'.$lowest;
    }

?>

最快的?无数的答案太宽泛了。您需要对每个可能的答案进行基准测试,以确定什么是FastStok,更改了我的问题将所有答案收集在一个数组中,使用函数,选择第一个。您实际上需要递归获取这些目录名。我没有看到问题中提到的。我把它理解为平面目录结构。如果是这样,那么他可以使用递归目录迭代器确保OP可以走这条路,最有可能的是OP也会要求这一部分,因为它只是要求完整的代码,那么我祝你好运:这些目录每天都不同,所以它们不能硬编码。老实说,你不知道如何阅读Structure?使用glob或directoryinterator,就可以使用我上面写的函数数组。
<?php

    $base = 'dir';
    $yearLowest = lowestDir($base);
    $monthLowest = lowestDir($yearLowest);
    $dayLowest = lowestDir($monthLowest);

    echo $dayLowest;

    function lowestDir($dir) {
        $lowest = null;
        $handle = opendir($dir);

        while(($name = readdir($handle))) {
            if($name == '.' || $name == '..') {
                continue;
            }

            if(is_dir($dir.'/'.$name) && ($lowest == null || $name < $lowest)) {
                $lowest = $name;
            }
        }

        closedir($handle);
        return $dir.'/'.$lowest;
    }

?>