Возвращает общее количество файлов в папке с помощью PHP
Есть ли лучший/более простой способ найти количество изображений в каталоге и вывести их в переменную?
function dirCount($dir) {
$x = 0;
while (($file = readdir($dir)) !== false) {
if (isImage($file)) {$x = $x + 1}
}
return $x;
}
Это похоже на такой длинный способ сделать это, нет ли более простого способа?
Примечание. Функция isImage() возвращает true, если файл является изображением.
Ответы
Ответ 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;
}