Получите самые последние файлы рекурсивно с PHP - PullRequest
1 голос
/ 27 мая 2010

Я ищу код, который рекурсивно перечисляет пять самых последних файлов в каталоге.

Это нерекурсивный код, и он был бы идеален для меня, если бы он был рекурсивным:

<?php

$show = 0; // Leave as 0 for all
$dir = 'sat/'; // Leave as blank for current

if($dir) chdir($dir);
$files = glob( '*.{html,php,php4,txt}', GLOB_BRACE );
usort( $files, 'filemtime_compare' );

function filemtime_compare( $a, $b )
{
    return filemtime( $b ) - filemtime( $a );
}
$i = 0;
foreach ( $files as $file )
{
    ++$i;
    if ( $i == $show ) break;
    echo $file . ' - ' . date( 'D, d M y H:i:s', filemtime($file) ) . '<br />' . "\n";  /* This is the output line */
}
?>

Можно ли изменить его для рекурсивного сканирования каталогов?

Ответы [ 3 ]

2 голосов
/ 28 мая 2010

Это была моя первая версия (проверенная, рабочая):

function latest($searchDir, array $files = array()) {
    $search = opendir($searchDir);

    $dirs = array();
    while($item = readdir($search)) {
        if ($item == '.' || $item == '..') { continue; }
        if (is_dir($searchDir.'/'.$item)) {
            $dirs[] = $searchDir.'/'.$item;
        }
        if (is_file($searchDir.'/'.$item)) {
            $ftime = filemtime($searchDir.'/'.$item);
            $files[$ftime] = $searchDir.'/'.$item;
        }
    }
    closedir($search);
    if (count($dirs) > 0) {
        foreach ($dirs as $dir) {
            $files += latest($dir,$files);
        }
    }
    krsort($files);
    $files = array_slice($files, 0, 5, true);
    return $files;
}

Но мне нравится использование байта glob(), поэтому вот его слегка измененная версия для возврата того же формата:

function top5modsEx($dir) {
    $mods = array();
    foreach (glob($dir . '/*') as $f) {
        $mods[filemtime($f)] = $f;
    }
    krsort($mods);
    return array_slice($mods, 0, 5, true);
}

Возвращает время (формат отметки времени UNIX), в течение которого файл был изменен как ключ элемента в массиве.

1 голос
/ 28 мая 2010

Это довольно быстро, грязно и не проверено, но может помочь вам начать:

function top5mods($dir)
{
  $mods = array();
  foreach (glob($dir . '/*') as $f) {
    $mods[] = filemtime($f);
  }
  sort($mods);
  $mods = array_reverse($mods);
  return array_slice($mods, 0, 5);
}
0 голосов
/ 28 мая 2010

Проверьте это решение в руководстве по PHP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...