PHP получить список файлов, соответствующих шаблону и отсортировать по самому старому файлу

1

если у меня есть каталог, где список файлов выглядит следующим образом:

Something_2015020820.txt
something_5294032944.txt.a
something_2015324234.txt
Something_2014435353.txt.a

и я хочу получить список сортировки файлов по самой старой дате (а не по имени файла), и результат должен принимать все, что соответствует something_xxxxxxx.txt. Итак, все, что заканчивается на ".a", не включено. в этом случае он должен вернуться

Something_2015020820.txt
something_2015324234.txt

Я делаю поиск по Google, и, похоже, я могу использовать glob

$listOfFiles = glob($this->directory . DIRECTORY_SEPARATOR . $this->pattern . "*");

но я не уверен в шаблоне.

Было бы замечательно, если бы вы могли обеспечить как чувствительный к регистру, так и нечувствительный шаблон. Шаблон соответствия должен быть something_number.txt

Теги:
directory
file
glob

2 ответа

2

Это немного сложно с помощью glob. Он поддерживает ограниченное сопоставление шаблонов. Например, вы можете сделать

glob("*.[tT][xX][tT]");

Это будет соответствовать file.txt и file.TXT, но также будет соответствовать file.tXt и file.TXt. К сожалению, нет способа указать что-то вроде file.(txt or TXT). Если это не проблема, отлично! В противном случае вам придется сначала использовать этот метод, чтобы как минимум сократить результаты вниз, а затем выполнить некоторую дополнительную обработку впоследствии. array_filter и некоторое регулярное выражение.

Лучшим вариантом может быть использование классов PHP Iterator, поэтому вы можете указать гораздо более сложные правила.

$directoryIterator = new RecursiveDirectoryIterator($directory);
$iteratorIterator = new RecursiveIteratorIterator($directoryIterator);
$fileList = new RegexIterator($iteratorIterator, '/^.*\.(txt|TXT)$/');
foreach($fileList as $file) {
    echo $file;
}
  • 0
    Отличный ответ, но как файлы будут заказаны?
  • 0
    Вопрос, связанный с моим комментарием: stackoverflow.com/questions/57685464
1

Вы можете использовать scandir для получения всех ваших файлов. Затем preg_match фильтрует эти файлы до тех, которые не заканчиваются на .a. Затем filemtime можно использовать, чтобы вытащить время последнего изменения файла. array_multisort может затем использоваться для сортировки к моменту последнего изменения файла и поддержки ассоциации key/filename.

Это работает так, как я ожидал:

date_default_timezone_set('America/New_York'); //change to your timezone
$directory = 'Your Directory';
$files = scandir($directory);
foreach($files as $file) {
    if(!preg_match('~\.a$~', $file) && !is_dir($directory . $file)) {
        $time["$file"] = filemtime($upload_directory . $file);
    }
}
array_multisort($time);

Затем для обработки вывода вы можете сделать что-то вроде:

foreach($time as $file => $da_time){
    echo $file . ' '. date('m/d/Y H:i:s', $da_time) . "\n";
}

preg_match может иметь i добавлен после ~ разделителя поэтому регулярное выражение чувствительны к регистру; или вы можете просто изменить a на [aA].

Ещё вопросы

Сообщество Overcoder
Наверх
Меню