Есть ли лучший / более простой способ найти количество изображений в каталоге и вывести их в переменную?
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; }
(FYI есть недокументированная функция, называемая iterator_count (), но, вероятно, лучше не полагаться на нее, пока я себе представляю. И вам нужно будет отфильтровать невидимые вещи, как и все равно.)
Это даст вам счет того, что находится в вашем каталоге. Я оставлю часть о подсчете только изображений для вас, поскольку я собираюсь fallll aaasssllleeelppppppzzzzzzzzzzzzz.
iterator_count(new DirectoryIterator('path/to/dir/'));
я делаю это так:
$files = scandir($dir); $x = count($files); echo $x;
но он также учитывает. а также ..
вы можете использовать glob
…
$count = 0; foreach (glob("*.*") as $file) { if (isImage($file)) ++$count; }
или, я не уверен, насколько это подходит вашим потребностям, но вы можете это сделать:
$count = count(glob("*.{jpg,png,gif,bmp}"));
Вышеупомянутый код
$count = count(glob("*.{jpg,png,gif,bmp}"));
это ваш лучший результат, но бит {jpg, png, gif} будет работать, только если вы GLOB_BRACE
флаг GLOB_BRACE
в конец:
$count = count(glob("*.{jpg,png,gif,bmp}", GLOB_BRACE));
Вы также можете использовать SPL для фильтрации содержимого DirectoryIterator
с isImage
функции 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));
Используя этот подход, в зависимости от того, как вам нужно использовать этот код, может возникнуть смысл переместить функцию ImageIterator
класс 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/[!\.]*"));
Вот хороший список фильтров glob для целей сопоставления файлов.
$nfiles = glob("/path/to/file/[!\\.]*"); if ($nfiles !== FALSE){ return count($nfiles); } else { return 0; }