我的网络应用程序中有如下文件夹结构。
如何使用php递归获取每个文件夹中的文件数。 我正在使用Codeignaiter。 我对如何完成这项任务一无所知。
我无法使用 scandir 功能,因为没有物理功能 path中的目录。只保存在数据库中的文件和文件夹。
这是我的数据库
请提供任何帮助。 谢谢。
答案 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;
}
答案 1 :(得分: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文件包含一个索引数组。
答案 2 :(得分: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)的记录很少,但它包含许多有用的东西,可以帮助您不必重复重复使用。