有没有更好/更简单的方法来查找目录中的图像数量并将它们输出到变量?
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() 的未记录函数,但我想现在最好不要依赖它。而且你需要过滤掉看不见的东西,比如 . 和 .. 无论如何。)
这将为您提供目录中的内容的计数。我将把关于只计算图像的部分留给你,因为我即将跌倒aaasssllleeelppppppzzzzzzzzzzzzzzz。
iterator_count(new DirectoryIterator('path/to/dir/'));
我这样做:
$files = scandir($dir);
$x = count($files);
echo $x;
但它也算。和 ..
上述代码
$count = count(glob("*.{jpg,png,gif,bmp}"));
是您最好的,但 {jpg,png,gif} 位仅在您GLOB_BRACE
在末尾附加标志时才有效:
$count = count(glob("*.{jpg,png,gif,bmp}", GLOB_BRACE));
你可以用glob
...
$count = 0;
foreach (glob("*.*") as $file) {
if (isImage($file)) ++$count;
}
或者,我不确定这是否适合您的需求,但您可以这样做:
$count = count(glob("*.{jpg,png,gif,bmp}"));
您还可以使用 SPL通过扩展抽象类DirectoryIterator
来使用您的函数过滤 a 的内容。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
类中以将所有内容整齐地包装在一个地方可能更有意义。
我使用以下内容来获取 Laravel 一个目录中所有类型文件的计数
$dir = public_path('img/');
$files = glob($dir . '*.*');
if ( $files !== false )
{
$total_count = count( $files );
return $totalCount;
}
else
{
return 0;
}
您的答案似乎很简单。我想不出在 PHP 或 Perl 中更短的方法。
如果您使用的是 Linux,则可能可以使用涉及 ls、wc 和 grep 的 system / exec 命令,具体取决于 isImage() 的复杂程度。
无论如何,我认为你所拥有的已经足够了。您只需编写一次函数。
我用它来返回目录中所有文件的计数,除了 . 和 ..
return count(glob("/path/to/file/[!\.]*"));
这是用于文件匹配目的的 glob 过滤器的一个很好的列表。
$nfiles = glob("/path/to/file/[!\\.]*");
if ($nfiles !== FALSE){
return count($nfiles);
} else {
return 0;
}