Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/274.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_Iterator - Fatal编程技术网

Php 获取迭代器中项数的最快方法是什么?

Php 获取迭代器中项数的最快方法是什么?,php,iterator,Php,Iterator,我有一个文件夹结构,里面有超过300000个文件和文件夹 当我迭代此结构以获取特定类型的所有文件时,这需要大约半秒钟的时间来完成: $path = "/path/to/folder"; $folder = new RecursiveDirectoryIterator($path); $iterator = new RecursiveIteratorIterator($folder); $files = new RegexIterator($iterator, '/^.+\.jpg$/i',

我有一个文件夹结构,里面有超过300000个文件和文件夹

当我迭代此结构以获取特定类型的所有文件时,这需要大约半秒钟的时间来完成:

$path = "/path/to/folder";

$folder = new RecursiveDirectoryIterator($path);
$iterator = new RecursiveIteratorIterator($folder);

$files = new RegexIterator($iterator, '/^.+\.jpg$/i', RecursiveRegexIterator::GET_MATCH);
但是获得结果迭代器($files)的长度大约需要10秒:

是否有更快的方法获取迭代器中的项数?可能在迭代期间?


这些都需要大约10秒钟:

1.find(命令行)

2.scandir(PHP,)


注:


我在数我脑子里的秒数。因此,两种方法之间可能会有一些细微的差别,但它并没有大到与我相关。

您是否尝试过使用带有
scandir
/
preg\u match
的普通递归函数来做同样的事情,以及它有多快/慢?@CharlotteDunois是的,我尝试过(参见我的编辑),而且在执行时间上没有明显的差异。
$files=new RegexIterator
不会遍历这些文件。它只是创建一个准备工作的指针。真正的迭代发生在您调用
迭代器\u count
或在循环中使用该迭代器时。半秒钟是准备结构和指针的时间。
$n = iterator_count($files);
find /path/to/folder -type f | wc -l
$intFileCount = countFilesInDirectory($path, array('jpg'));
echo $intFileCount;
function countFilesInDirectory($strPathToDirectory, $arrExtensions) {
    $intFileCount = 0;
    $arrFiles = scandir($strPathToDirectory);
    foreach($arrFiles as $strFile) {
        if('.' != $strFile && '..' != $strFile) {
            if(is_dir("$strPathToDirectory/$strFile") && is_readable("$strPathToDirectory/$strFile")) {
                $intFileCount += countFilesInDirectory("$strPathToDirectory/$strFile", $arrExtensions);
            } else {
                $arrFileInfo = pathinfo($strFile);
                if(in_array($arrFileInfo['extension'], $arrExtensions)) {
                    $intFileCount += 1;
                }
            }
        }
    }
    return $intFileCount;
}