Подтвердить что ты не робот

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

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

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

Это похоже на такой длинный способ сделать это, нет ли более простого способа?

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

4b9b3361

Ответ 1

Проверьте стандартную библиотеку PHP (она же SPL) для DirectoryIterator:

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

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

Ответ 2

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

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

Ответ 3

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

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

но он также учитывает. и..

Ответ 4

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

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

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

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

Ответ 5

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

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

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

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

Ответ 6

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

Ответ 7

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

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

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

Ответ 8

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

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

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

Ответ 9

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

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

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

Ответ 10

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

if ($nfiles !== FALSE){

    return count($nfiles);

} else {

    return 0;

}