Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP返回文件夹中的文件总数_Php_File_Count_Directory - Fatal编程技术网

使用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
的文件。