если у меня есть каталог, где список файлов выглядит следующим образом:
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
Это немного сложно с помощью 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;
}
Вы можете использовать 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]
.