12

有没有更好/更简单的方法来查找目录中的图像数量并将它们输出到变量?

function dirCount($dir) {
  $x = 0;
  while (($file = readdir($dir)) !== false) {
    if (isImage($file)) {$x = $x + 1}
  }
  return $x;
}

这似乎是一个很长的路要走,没有更简单的方法吗?

注意:如果文件是图像,isImage() 函数将返回 true。

4

10 回答 10

25

查看 DirectoryIterator 的标准 PHP 库(又名 SPL):

$dir = new DirectoryIterator('/path/to/dir');
foreach($dir as $file ){
  $x += (isImage($file)) ? 1 : 0;
}

(仅供参考,有一个名为 iterator_count() 的未记录函数,但我想现在最好不要依赖它。而且你需要过滤掉看不见的东西,比如 . 和 .. 无论如何。)

于 2008-10-22T03:55:38.050 回答
15

这将为您提供目录中的内容的计数。我将把关于只计算图像的部分留给你,因为我即将跌倒aaasssllleeelppppppzzzzzzzzzzzzzzz。

iterator_count(new DirectoryIterator('path/to/dir/'));
于 2008-10-22T04:40:54.340 回答
5

我这样做:

$files = scandir($dir);
$x = count($files);
echo $x;

但它也算。和 ..

于 2013-01-28T17:12:17.603 回答
4

上述代码

$count = count(glob("*.{jpg,png,gif,bmp}"));

是您最好的,但 {jpg,png,gif} 位仅在您GLOB_BRACE在末尾附加标志时才有效:

$count = count(glob("*.{jpg,png,gif,bmp}", GLOB_BRACE));
于 2010-10-11T11:03:51.093 回答
3

你可以用glob...

$count = 0;
foreach (glob("*.*") as $file) {
    if (isImage($file)) ++$count;
}

或者,我不确定这是否适合您的需求,但您可以这样做:

$count = count(glob("*.{jpg,png,gif,bmp}"));
于 2008-10-22T04:45:50.507 回答
1

您还可以使用 SPL通过扩展抽象类DirectoryIterator来使用您的函数过滤 a 的内容。isImageFilterIterator

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类中以将所有内容整齐地包装在一个地方可能更有意义。

于 2009-05-31T11:21:23.617 回答
1

我使用以下内容来获取 Laravel 一个目录中所有类型文件的计数

   $dir = public_path('img/');
    $files = glob($dir . '*.*');

    if ( $files !== false )
    {
        $total_count = count( $files );
        return $totalCount;
    }
    else
    {
        return 0;
    }
于 2016-02-24T12:59:02.870 回答
0

您的答案似乎很简单。我想不出在 PHP 或 Perl 中更短的方法。

如果您使用的是 Linux,则可能可以使用涉及 ls、wc 和 grep 的 system / exec 命令,具体取决于 isImage() 的复杂程度。

无论如何,我认为你所拥有的已经足够了。您只需编写一次函数。

于 2008-10-22T04:09:33.357 回答
0

我用它来返回目录中所有文件的计数,除了 . 和 ..

return count(glob("/path/to/file/[!\.]*"));

这是用于文件匹配目的的 glob 过滤器的一个很好的列表。

于 2013-05-08T15:18:28.027 回答
0
$nfiles = glob("/path/to/file/[!\\.]*");

if ($nfiles !== FALSE){

    return count($nfiles);

} else {

    return 0;

}
于 2013-06-02T09:42:13.507 回答