2016-11-23 4 views
0

У меня есть структура папок, как показано ниже в моем веб-приложении.Как получить количество файлов в рекурсивной папке в php

enter image description here

Как я могу получить количество файлов в каждой папке рекурсивно с помощью PHP. Я работаю с Codeignaiter. Я не знаю, как это сделать.

Я не могу использовать ScanDir функцию, потому что нет никакого физического каталога в path.Only файлы и папки сохранения в базе данных.

Это моя база данных

enter image description here

Пожалуйста любую необходимую помощь. Спасибо.

+0

Пробовал что-нибудь еще? – Xorifelse

+0

рекурсивный итератор каталогов или какая-либо другая рекурсивная функция? – Rasclatt

+0

Нет, я не знаю, как его запустить. –

ответ

0

Попробуйте эту функцию, передавая путь в качестве параметра в нем:

function getFileCount($path) { 
     $size = 0; 
     $ignore = array('.','..','cgi-bin','.DS_Store'); 
     $files = scandir($path); 
     foreach($files as $t) { 
      if(in_array($t, $ignore)) continue; 
      if (is_dir(rtrim($path, '/') . '/' . $t)) { 
       $size += getFileCount(rtrim($path, '/') . '/' . $t); 
      } else { 
       $size++; 
      } 
     } 
     return $size; 
    } 
+0

Спасибо за ваши усилия. Но я не могу использовать это, потому что это не физический каталог. И я не могу использовать функцию 'scandir', потому что нет никакой директории path.only save в базе данных. –

0

Если вы хотели бы получить, скажем, все *.php файлы в папке проекта, рекурсивно, вы можете использовать следующее: Source

<?php 

$Directory = new RecursiveDirectoryIterator('path/to/project/'); 
$Iterator = new RecursiveIteratorIterator($Directory); 
$Regex = new RegexIterator($Iterator, '/^.+\.php$/i', RecursiveRegexIterator::GET_MATCH); 

?> 

$Regex будет содержать один массив индексов для каждого файла PHP.

+0

Но проблема в том, что у меня нет каких-либо файлов и папок только для «path», которые сохраняются в базе данных и отображают данные базы данных. –

+0

@MenakaKariyawasam вы можете показать вам вход в базу данных? – Tiger

+0

Я добавил свою структуру базы данных. Спасибо. –

0

Вы можете продлить RecursiveArrayIterator, чтобы получить вид RecursiveDirectoryIterator но для виртуальной файловой системы:

class RecursiveVirtualDirectoryIterator extends RecursiveArrayIterator 
{ 
    private $files; 

    public function __construct($parentId, $array = [], $flags = 0) 
    { 
     $this->files = $array; 

     parent::__construct(
      $this->getFilesByParentId($parentId), 
      $flags 
     ); 
    } 

    private $children; 
    public function hasChildren() 
    { 
     $file = $this->current(); 

     if ($file['is_file']) { 
      return false; 
     } 

     $this->children = $this->getFilesByParentId($file['id']); 

     return !empty($this->children); 
    } 

    private function getFilesByParentId($id) 
    { 
     return array_filter($this->files, function ($file) use ($id) { 
      return $file['parent_id'] === $id; 
     }); 
    } 

    public function getChildren() 
    { 
     $file = $this->current(); 
     return new static(
      $file['id'], 
      $this->children, 
      $this->getFlags() 
     ); 
    } 
} 

Затем вы можете итерации по вашей возвращаемый массив из баз данных с использованием RecursiveIteratorIterator и подсчета файлов для, скажем, вершинных папок:

$iterator = new RecursiveIteratorIterator(
    new RecursiveVirtualDirectoryIterator(0, $files), 
    RecursiveIteratorIterator::SELF_FIRST 
); 

$currentDirectoryName = null; 
$filesCount = []; 
foreach ($iterator as $file) { 
    if ($iterator->getDepth() === 0 && !$file['is_file']) { 
     $currentDirectoryName = $file['name']; 
     $filesCount[$currentDirectoryName] = 0; 
     continue; 
    } 

    $filesCount[$currentDirectoryName] += 1; 
} 

Это working demo.

В то время как Standard PHP Library (SPL) плохо документирован, он содержит много полезных вещей, которые избавляют вас от повторного использования колеса снова и снова.

Смежные вопросы