Возврат общего количества файлов в папке с использованием PHP - PullRequest
12 голосов
/ 22 октября 2008

Есть ли лучший / более простой способ найти количество изображений в каталоге и вывести их в переменную?

function dirCount($dir) {
  $x = 0;
  while (($file = readdir($dir)) !== false) {
    if (isImage($file)) {$x = $x + 1}
  }
  return $x;
}

Кажется, что это такой долгий путь, нет более простого способа?

Примечание: Функция isImage () возвращает true, если файл является изображением.

Ответы [ 10 ]

25 голосов
/ 22 октября 2008

Ознакомьтесь со стандартной библиотекой PHP (она же SPL) для DirectoryIterator:

$dir = new DirectoryIterator('/path/to/dir');
foreach($dir as $file ){
  $x += (isImage($file)) ? 1 : 0;
}

(К вашему сведению, существует недокументированная функция iterator_count (), но, пожалуй, лучше не полагаться на нее сейчас, я мог бы себе представить. И вам нужно было бы отфильтровать такие невидимые вещи, как ... и ... в любом случае.)

14 голосов
/ 22 октября 2008

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

iterator_count(new DirectoryIterator('path/to/dir/'));
5 голосов
/ 28 января 2013

Я делаю это так:

$files = scandir($dir);
$x = count($files);
echo $x;

но он также считает. и ..

4 голосов
/ 11 октября 2010

Вышеупомянутый код

$count = count(glob("*.{jpg,png,gif,bmp}"));

ваш лучший вариант, но бит {jpg, png, gif} будет работать только в том случае, если вы добавите флаг GLOB_BRACE в конце:

$count = count(glob("*.{jpg,png,gif,bmp}", GLOB_BRACE));
3 голосов
/ 22 октября 2008

вы можете использовать glob ...

$count = 0;
foreach (glob("*.*") as $file) {
    if (isImage($file)) ++$count;
}

или, я не уверен, насколько хорошо это будет соответствовать вашим потребностям, но вы можете сделать это:

$count = count(glob("*.{jpg,png,gif,bmp}"));
1 голос
/ 24 февраля 2016

Я использую следующее для подсчета всех типов файлов в одном каталоге в Laravel

   $dir = public_path('img/');
    $files = glob($dir . '*.*');

    if ( $files !== false )
    {
        $total_count = count( $files );
        return $totalCount;
    }
    else
    {
        return 0;
    }
1 голос
/ 31 мая 2009

Вы также можете использовать SPL для фильтрации содержимого DirectoryIterator, используя функцию isImage, расширяя абстрактный класс FilterIterator.

class ImageIterator extends FilterIterator {

    public function __construct($path)
    {
        parent::__construct(new DirectoryIterator($path));
    }

    public function accept()
    {
        return isImage($this->getInnerIterator());
    }
}

Затем вы можете использовать iterator_count (или реализовать интерфейс Countable и использовать встроенную функцию count), чтобы определить количество изображений. Например:

$images = new ImageIterator('/path/to/images');
printf('Found %d images!', iterator_count($images));

Используя этот подход, в зависимости от того, как вам нужно использовать этот код, может иметь смысл переместить функцию isImage в класс ImageIterator, чтобы все аккуратно обернуть в одном месте.

0 голосов
/ 02 июня 2013
$nfiles = glob("/path/to/file/[!\\.]*");

if ($nfiles !== FALSE){

    return count($nfiles);

} else {

    return 0;

}
0 голосов
/ 08 мая 2013

Я использую это, чтобы вернуть количество ВСЕХ файлов в каталоге, кроме. и ..

return count(glob("/path/to/file/[!\.]*"));

Вот хороший список глобальных фильтров для сопоставления файлов.

0 голосов
/ 22 октября 2008

Ваш ответ кажется настолько простым, насколько вы можете его получить. Я не могу придумать более короткий путь в PHP или Perl.

Вы можете использовать команду system / exec, включающую ls, wc и grep, если вы используете Linux в зависимости от сложности isImage ().

Несмотря на это, я думаю, что у вас вполне достаточно. Вы должны написать функцию только один раз.

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