2008-10-22 2 views
12

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

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

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

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

ответ

25

Заканчивать Стандартная библиотека PHP (ака SPL) для DirectoryIterator:.

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

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

+2

Вот что я собирался опубликовать. Я думаю, что ваше решение - это путь. – Stuart 2008-10-22 04:24:55

+0

AWSOME! Только то, что я искал! – PHLAK 2008-10-22 06:08:06

0

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

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

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

+0

Я стараюсь избегать System и Exec (сначала безопасность!), Но я буду помнить об этом. – PHLAK 2008-10-22 05:59:58

+0

Если вы обнаружите, что ваша функция isImage() и текущий метод работают медленно, я думаю, что выполнение ls и piping в wc -l может быть быстрее. Я бы сделал это только в том случае, если ваш текущий метод медленный, потому что ваше право по соображениям безопасности не использовать system/exec. – GnomeCubed 2009-01-12 22:09:43

13

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

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

вы могли бы использовать glob ...

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

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

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

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

3

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

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

ваш лучший лучше, но {JPG, PNG, GIF} бит будет работать только если вы добавите GLOB_BRACE флаг на конце:

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

я сделайте это так:

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

, но это также считается. и ..

0

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

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

Вот a good list of glob filters для целей сопоставления файлов.

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

if ($nfiles !== FALSE){ 

    return count($nfiles); 

} else { 

    return 0; 

} 
1

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

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

    if ($files !== false) 
    { 
     $total_count = count($files); 
     return $totalCount; 
    } 
    else 
    { 
     return 0; 
    } 
Смежные вопросы