使用PHP返回文件夹中的文件总数
是否有更好/更简单的方法来查找目录中的图像数量并将其输出到变量使用PHP返回文件夹中的文件总数,php,file,count,directory,Php,File,Count,Directory,是否有更好/更简单的方法来查找目录中的图像数量并将其输出到变量 function dirCount($dir) { $x = 0; while (($file = readdir($dir)) !== false) { if (isImage($file)) {$x = $x + 1} } return $x; } 这似乎是一个漫长的过程,没有更简单的方法吗 注意:如果文件是图像,isImage()函数将返回true。查看DirectoryIterator的标准PHP库
function dirCount($dir) {
$x = 0;
while (($file = readdir($dir)) !== false) {
if (isImage($file)) {$x = $x + 1}
}
return $x;
}
这似乎是一个漫长的过程,没有更简单的方法吗
注意:如果文件是图像,isImage()函数将返回true。查看DirectoryIterator的标准PHP库(也称为SPL):
$dir = new DirectoryIterator('/path/to/dir');
foreach($dir as $file ){
$x += (isImage($file)) ? 1 : 0;
}
(仅供参考,这里有一个名为iterator_count()的未记录函数,但我想现在最好不要依赖它。而且你需要过滤掉看不见的东西,比如。和..无论如何。)你的答案似乎很简单。在PHP或Perl中,我想不出一个更短的方法来实现它 如果您使用的是Linux,则可能需要一个涉及ls、wc和grep的system/exec命令,具体取决于isImage()的复杂程度
不管怎样,我认为你所拥有的已经足够了。您只需编写一次函数。这将为您提供目录中的内容计数。我将把关于只计算图像的部分留给你们,因为我将要落下一个错误
iterator_count(new DirectoryIterator('path/to/dir/'));
您可以使用
glob
$count = 0;
foreach (glob("*.*") as $file) {
if (isImage($file)) ++$count;
}
或者,我不确定这是否适合您的需要,但您可以这样做:
$count = count(glob("*.{jpg,png,gif,bmp}"));
您还可以通过扩展抽象
filterierator
类,使用isImage
函数使用SPL来过滤DirectoryIterator
的内容
class ImageIterator extends FilterIterator {
public function __construct($path)
{
parent::__construct(new DirectoryIterator($path));
}
public function accept()
{
return isImage($this->getInnerIterator());
}
}
然后,您可以使用迭代器\u count
(或者实现可计数
接口并使用本机count
函数)来确定图像的数量。例如:
$images = new ImageIterator('/path/to/images');
printf('Found %d images!', iterator_count($images));
使用这种方法,根据您需要如何使用此代码,将
isImage
函数移动到ImageIterator
类中,将所有内容整齐地包装在一个地方可能更有意义。前面提到的代码
$count = count(glob("*.{jpg,png,gif,bmp}"));
是最好的,但是{jpg,png,gif}位只有在末尾附加GLOB_括号
标志时才有效:
$count = count(glob("*.{jpg,png,gif,bmp}", GLOB_BRACE));
我是这样做的:
$files = scandir($dir);
$x = count($files);
echo $x;
但这也算数了。和..我用它来返回目录中所有文件的计数,除了。和
return count(glob("/path/to/file/[!\.]*"));
以下是用于文件匹配的目的。我使用以下方法获取Laravel中一个目录中所有类型文件的计数
$nfiles = glob("/path/to/file/[!\\.]*");
if ($nfiles !== FALSE){
return count($nfiles);
} else {
return 0;
}
$dir = public_path('img/');
$files = glob($dir . '*.*');
if ( $files !== false )
{
$total_count = count( $files );
return $totalCount;
}
else
{
return 0;
}
这就是我要发布的内容。我认为你的解决方案是正确的。真糟糕!这正是我要找的!我尽量避免使用System和Exec(安全第一!),但我会记住这一点。如果您发现您的isImage()函数和当前方法很慢,我认为执行ls并将其传输到wc-l可能会更快。不过,我只会在您当前的方法很慢的情况下这样做,因为您有权了解不使用system/exec的安全原因。它还检索文件夹,所以据我所知,您应该循环查看
$files
数组,并检查它是否是使用is_file
的文件。