2016-01-29 4 views
3

Я использовал count(glob("test/*")) для подсчета подпапок в папке test, но теперь, когда у меня также есть файлы в папке test, а не только в папках, я получаю неправильные результаты. Есть ли способ изменить шаблон glob, чтобы он возвращал только папки, а не файлы?Получить подсчет вложенных папок

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

$total_items = count(glob("test/*")); 
$total_files = count(glob("test/*.*")); 
$folder_count = $total_items - $total_files; 

Это работает, но может быть и более простой способ сделать это.

ответ

5

Вы должны использовать опцию GLOB_ONLYDIR возвращать только каталоги:

$total_items = count(glob("test/*", GLOB_ONLYDIR)); 
+0

Это хорошо ☺ ☻. Однако он не учитывается глубже в подпапках ... но этот подход помог мне сделать это, также объединив его с этим другим [ответом] (http://stackoverflow.com/a/4339437/1883256). – Pathros

0

Я хотел бы попробовать что-то вроде этого, используя READDIR() и тест с is_dir() (http://php.net/manual/en/function.opendir.php)

$dir = "test"; 
$n = 0; 
$dh = opendir($dir); 
while (($file = readdir($dh)) !== false) { 
    if ($file != "." && $file != ".." && is_dir($dir . DIRECTORY_SEPARATOR . $file)) { 
     $n++; 
    } 
} 
closedir($dh); 
echo $n . " subdirectories in " . $dir; 
1

Ваше текущее решение может выйти из строя, если есть каталог с точкой в ​​своем имени, например some.dir. Для получения лучших результатов вы можете проверить каждый из результатов, чтобы узнать, являются ли они файлами. Что-то вроде:

count(array_filter(glob("test/*"), "is_dir")) 
Смежные вопросы