有没有更好/更简单的方法来查找目录中的图像数量并将它们输出到变量?
function dirCount($dir) {
$x = 0;
while (($file = readdir($dir)) !== false) {
if (isImage($file)) {$x = $x + 1}
}
return $x;
}
这似乎有很长的路要走,有没有更简单的方法?
注意:如果文件是图像,则isImage()函数返回true。
答案 0 :(得分:25)
查看DirectoryIterator的标准PHP库(又名SPL):
$dir = new DirectoryIterator('/path/to/dir');
foreach($dir as $file ){
$x += (isImage($file)) ? 1 : 0;
}
(仅供参考,有一个名为iterator_count()的未记录函数,但我现在最好不要依赖它。而且你需要过滤出看不见的东西,比如。和..无论如何。)
答案 1 :(得分:14)
这将为您提供您的目录中的数量。我将离开关于只计算图像给你的部分,因为我即将falll aaasssllleeelppppppzzzzzzzzzzzzzzz。
iterator_count(new DirectoryIterator('path/to/dir/'));
答案 2 :(得分:5)
$files = scandir($dir);
$x = count($files);
echo $x;
但它也很重要。和..
答案 3 :(得分:4)
上述代码
$count = count(glob("*.{jpg,png,gif,bmp}"));
是你最好的,但{jpg,png,gif}位只有在你追加GLOB_BRACE
标志时才有效:
$count = count(glob("*.{jpg,png,gif,bmp}", GLOB_BRACE));
答案 4 :(得分:3)
您可以使用glob
...
$count = 0;
foreach (glob("*.*") as $file) {
if (isImage($file)) ++$count;
}
或者,我不确定这能满足您的需求,但您可以这样做:
$count = count(glob("*.{jpg,png,gif,bmp}"));
答案 5 :(得分:1)
您还可以使用SPL通过扩展抽象DirectoryIterator
类来使用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
类以使所有内容整齐地包含在一个位置可能更有意义。 / p>
答案 6 :(得分:1)
我使用以下内容来获取Laravel
中一个目录中所有类型文件的计数 $dir = public_path('img/');
$files = glob($dir . '*.*');
if ( $files !== false )
{
$total_count = count( $files );
return $totalCount;
}
else
{
return 0;
}
答案 7 :(得分:0)
你的回答似乎就像你能得到它一样简单。在PHP或Perl中,我想不出更简单的方法。
如果你使用Linux,你可能能够使用涉及ls,wc和grep的system / exec命令,具体取决于isImage()的复杂程度。
无论如何,我认为你所拥有的就足够了。您只需编写一次该函数。
答案 8 :(得分:0)
我用它来返回目录中除ALL之外的所有文件的计数。和..
return count(glob("/path/to/file/[!\.]*"));
以下是a good list of glob filters用于文件匹配目的。
答案 9 :(得分:0)
$nfiles = glob("/path/to/file/[!\\.]*");
if ($nfiles !== FALSE){
return count($nfiles);
} else {
return 0;
}