Возврат общего количества файлов в папке с использованием PHP

StackOverflow https://stackoverflow.com/questions/224408

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

iterator_count(new DirectoryIterator('path/to/dir/'));

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

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

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

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

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

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

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

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

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

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

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

Вы также можете использовать 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 , чтобы все аккуратно обернулось в одном месте.

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

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

    if ( $files !== false )
    {
        $total_count = count( $files );
        return $totalCount;
    }
    else
    {
        return 0;
    }

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

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

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

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

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

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

$nfiles = glob("/path/to/file/[!\\.]*");

if ($nfiles !== FALSE){

    return count($nfiles);

} else {

    return 0;

}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top