Рекурсивный поиск файлов (PHP) - PullRequest
23 голосов
/ 07 декабря 2009

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

Например, возвращать только файлы .jpg в каталоге.

Вот мой код,

<?php
$it = new RecursiveDirectoryIterator("L:\folder\folder\folder");
foreach(new RecursiveIteratorIterator($it) as $file) {
echo $file . "<br/> \n";
}
?>

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

Ответы [ 6 ]

32 голосов
/ 07 декабря 2009
<?php
$it = new RecursiveDirectoryIterator("L:\folder\folder\folder");
$display = Array ( 'jpeg', 'jpg' );
foreach(new RecursiveIteratorIterator($it) as $file)
{
    if (in_array(strtolower(array_pop(explode('.', $file))), $display))
        echo $file . "<br/> \n";
}
?>
20 голосов
/ 07 декабря 2009

Вы должны создать фильтр:

class JpegOnlyFilter extends RecursiveFilterIterator
{
    public function __construct($iterator)
    {
        parent::__construct($iterator);
    }

    public function accept()
    {
        return $this->current()->isFile() && preg_match("/\.jpe?g$/ui", $this->getFilename());
    }

    public function __toString()
    {
        return $this->current()->getFilename();
    }
}

$it = new RecursiveDirectoryIterator("L:\folder\folder\folder");
$it = new JpegOnlyFilter($it);
$it = new RecursiveIteratorIterator($it);

foreach ($it as $file)
    ...
7 голосов
/ 07 декабря 2009

Попробуйте, он использует массив разрешенных типов файлов и выводит файл только в том случае, если расширение файла существует в массиве.

<?php
$it = new RecursiveDirectoryIterator("L:\folder\folder\folder");
$allowed=array("pdf","txt");
foreach(new RecursiveIteratorIterator($it) as $file) {
    if(in_array(substr($file, strrpos($file, '.') + 1),$allowed)) {
        echo $file . "<br/> \n";
    }
}
?>

Вы также можете обнаружить, что можете передать массив разрешенных типов файлов в класс RecursiveDirectoryIterator и вернуть только те файлы, которые соответствуют.

5 голосов
/ 21 июня 2016

Пусть PHP сделает работу:

$directory = new RecursiveDirectoryIterator('path/to/directory/');
$iterator  = new RecursiveIteratorIterator($directory);
$regex     = new RegexIterator($iterator, '/\.jpe?g$/i', RecursiveRegexIterator::GET_MATCH);

echo '<pre>';
print_r($regex);
1 голос
/ 17 июля 2016

Что касается ответа с наибольшим количеством голосов: я создал этот код, который использует меньше функций, только 3, isset(), array_flip(), explode() вместо 4 функций. Я проверил ответ с наибольшим количеством голосов, и он был медленнее, чем мой. Я предлагаю попробовать:

$it = new RecursiveDirectoryIterator("L:\folder\folder\folder");
foreach(new RecursiveIteratorIterator($it) as $file) {
    $FILE = array_flip(explode('.', $file));
    if (isset($FILE['php']) || isset($FILE['jpg'])) {
        echo  $file. "<br />";
    }
}
0 голосов
/ 17 октября 2013

Возможно, вы захотите проверить эту страницу об использовании glob () для похожего поиска:

http://www.electrictoolbox.com/php-glob-find-files/

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