Php 目录迭代器和递归目录迭代器

Php 目录迭代器和递归目录迭代器,php,recursion,iterator,Php,Recursion,Iterator,我必须列出目录中的所有文件和文件夹: $images = array(); $dirs = array(); $dir = new DirectoryIterator($upload_dir_real); foreach ($dir as $file) { if ($file->isDot()) { continue

我必须列出目录中的所有文件和文件夹:

            $images = array();
            $dirs   = array();

            $dir = new DirectoryIterator($upload_dir_real);

             foreach ($dir as $file) {
               if ($file->isDot()) {
                    continue;
                }

                if ($file->isDir()) {
                    // dir
                    $scanned_dirs[] = $file->getPath();
                      continue;
                } else {
                    // file

                    //echo $file->getFilename() . "<br>\n";//DEBUG
                    $realfile =  $file->getFilename() . "<br>\n";
                    $realpath = $file->getPathname();
                    echo realpath($realfile);//DEBUG
                    $file->getFilename();
                    $images[] = realpath( $realpath );
                }

             }
这实际上调用了
递归迭代器
两次?我的意思是,如果它是递归的,它就不能递归两次:-)


2b-为什么找不到
filesystememitter
,即使PHP手册声明(据我所知)它是递归迭代器构建的一部分

(这些问题是因为我想更好地理解,而不仅仅是复制和粘贴答案)

3-是否有更好的方法跨平台列出所有文件夹和文件?

  • 1-为什么其他公认答案中描述的方法对我不起作用`
据我所知。代码工作得很好,但是您的实现是错误的,您使用的是以下代码

代码

而不是

    $dir = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($upload_dir_real));
  • 在同一个答案中,实际上调用递归迭代器两次??我的意思是,如果它是递归的,它就不能递归两次…:-)
不,没有区别

RecursiveIteratorIterator != RecursiveDirectoryIterator != FilesystemIterator
            ^                             ^                    
  • 为什么找不到FileSystemEditor,即使php手册声明(据我所知)它是递归迭代器构建基础的一部分
您在评论中已经回答说,您正在使用不再支持或推荐的PHP版本
5.2.9

  • 3-是否有更好的方法跨平台列出所有文件夹和文件
既然已经解决了这个问题,您只需要
filesystememitter::SKIP_DOTS
就不必调用
$file->isDot()

范例

$fullPath = __DIR__;
$dirs = $files = array();

$directory = new RecursiveDirectoryIterator($fullPath, FilesystemIterator::SKIP_DOTS);
foreach (new RecursiveIteratorIterator($directory, RecursiveIteratorIterator::SELF_FIRST) as $path ) {
    $path->isDir() ? $dirs[] = $path->__toString() : $files[] = realpath($path->__toString());
}

var_dump($files, $dirs);

下面是另一种方法,利用
setFlags

<?php

$o_dir = new RecursiveDirectoryIterator('.');
$o_dir->setFlags(RecursiveDirectoryIterator::SKIP_DOTS);
$o_iter = new RecursiveIteratorIterator($o_dir);

foreach ($o_iter as $o_info) {
   echo $o_info->getPathname(), "\n";
}

PHP 5.3中引入了
FileSystemEditor
,API文档仅表示基于它的
RecursiveDirectoryIterator
的当前状态。在上一段代码中,您没有两次使用RII,而是使用了一个RII和一个RDI。。我错过了RII和RDI-谢谢,(php版本也有解释-我使用5.2.9),但仍然-我如何使用is_dot或同等版本??如何使该函数工作?好的-谢谢(再次…:-),但它给了我相同的错误
致命错误:找不到类'FileSystemEmitter'
-是否有其他方法可以避免在我的php版本上出现相同的错误?只是一个简单的问题。。为什么您仍在使用不再受支持的php版本,即
5.2.9
嗯-这不是一个很好的答案-我的本地开发服务器就是这样。我从来没有遇到过任何问题(我是一个新手),但也许是时候同时升级我的技能和我的服务器了……php版本低的原因主要是因为兼容性支持。我使用wordpress开发(它仍然通过codex页面支持
5.2.4
),并且我遇到了许多仍然安装了该版本
(5.2.9)
的服务器。如果能知道在
php中是否可以使用递归迭代器,那就太好了
RecursiveIteratorIterator != RecursiveDirectoryIterator != FilesystemIterator
            ^                             ^                    
$fullPath = __DIR__;
$dirs = $files = array();

$directory = new RecursiveDirectoryIterator($fullPath, FilesystemIterator::SKIP_DOTS);
foreach (new RecursiveIteratorIterator($directory, RecursiveIteratorIterator::SELF_FIRST) as $path ) {
    $path->isDir() ? $dirs[] = $path->__toString() : $files[] = realpath($path->__toString());
}

var_dump($files, $dirs);
<?php

$o_dir = new RecursiveDirectoryIterator('.');
$o_dir->setFlags(RecursiveDirectoryIterator::SKIP_DOTS);
$o_iter = new RecursiveIteratorIterator($o_dir);

foreach ($o_iter as $o_info) {
   echo $o_info->getPathname(), "\n";
}