递归地查找文件夹中的所有.php文件


Find all .php files in folder recursively

使用PHP,如何在文件夹或其子文件夹(任何深度(中找到所有.PHP文件?

您可以使用RecursiveDirectoryIteratorRecursiveIteratorIterator:

$di = new RecursiveDirectoryIterator(__DIR__,RecursiveDirectoryIterator::SKIP_DOTS);
$it = new RecursiveIteratorIterator($di);
foreach($it as $file) {
    if (pathinfo($file, PATHINFO_EXTENSION) == "php") {
        echo $file, PHP_EOL;
    }
}

只需添加以下内容:

function listFolderFiles($dir){
    $ffs = scandir($dir);
    $i = 0;
    $list = array();
    foreach ( $ffs as $ff ){
        if ( $ff != '.' && $ff != '..' ){
            if ( strlen($ff)>=5 ) {
                if ( substr($ff, -4) == '.php' ) {
                    $list[] = $ff;
                    //echo dirname($ff) . $ff . "<br/>";
                    echo $dir.'/'.$ff.'<br/>';
                }    
            }       
            if( is_dir($dir.'/'.$ff) ) 
                    listFolderFiles($dir.'/'.$ff);
        }
    }
    return $list;
}
$files = array();
$files = listFolderFiles(dirname(__FILE__));

我修改了supajason创建的代码因为提供的代码没有返回一致的结果:主要是由于使用了命名法。

我还添加了一些功能。

<?php
define('ROOT', str_replace('''', '/', getcwd()).'/');

///########-------------------------------------------------------------
///########-------------------------------------------------------------
///######## FUNCTION TO LIST ALL FILES AND FOLDERS WITHIN A CERTAIN PATH
///########-------------------------------------------------------------
///########-------------------------------------------------------------
function list_folderfiles(
                            $dir,                   // *** TARGET DIRECTORY TO SCAN
                            $return_flat = true,    // *** DEFAULT FLAT ARRAY TO BE RETURNED
                            $iteration  = 0         // *** INTERNAL PARAM TO COUNT THE FUNCTIONS OWN ITERATIONS
                        ){
    ///######## PREPARE ALL VARIABLES
    $dir                    = rtrim($dir, '/');     // *** REMOVE TRAILING SLASH (* just for being pretty *)
    $files_folders          = scandir($dir);        // *** SCAN FOR ALL FILES AND FOLDERS
    $nested_folders         = [];                   // *** THE NESTED FOLDERS BUILD ARRAY
    static $total_files     = [];                   // *** THE TOTAL FILES ARRAY
    ///######## MAKE SURE THAT THE STATIC $fileS ARE WILL BE CLEARED AFTER THE FIRST ITERATION, RESET AS EMPTY ARRAY
    if($iteration === 0) $total_$files = [];

    ///######## RUN THROUGH ALL $fileS AND FOLDERS
    foreach($files_folders as $file){
        ///######### IF THE CURRENT ``file`` IS A DIRECTORY UP
        if($file === '.' || $file === '..') continue;
        
        ///######### IF IT CONCERNS A $file
        if(is_dir($dir.'/'.$file)){
            $iteration++;                                                                 // *** RAISE THE ITERATION
            $nested_folders[]   = list_folderfiles($dir.'/'.$file, false, $iteration);    // *** EXECUTE THE FUNCTION ITSELF
        }
        ///######### IF IT CONCERNS A $file
        else{
            $total_files[]      = $dir.'/'.$file;   // *** ADD THE $file TO THE TOTAL $fileS ARRAY
            $nested_folders[]   = $file;            // *** ADD THE $file TO THE NESTED FOLDERS ARRAY
        }
    }

    ///########==================================================
    ///######## IF A FLAT LIST SHOULD BE RETURNED
    ///########==================================================
    if($return_flat) return $total_files;
    ///######## IF A NESTED LIST SHOULD BE RETURNED
    else return $nested_folders;
    ///########==================================================
}
$files = list_folderfiles(ROOT, true);  // *** FLAT ARRAY
///$files = list_folderfiles(ROOT, false);  // *** NESTED ARRAY
echo print_r($files, true);

这与这里的另一个答案类似,但由于不需要SKIP_DOTS,因此删除了它,并与strict_types:一起使用

<?php
$o_dir = new RecursiveDirectoryIterator('.');
$o_iter = new RecursiveIteratorIterator($o_dir);
foreach ($o_iter as $o_info) {
   if ($o_info->getExtension() == 'php') {
      echo $o_info->getPathname(), "'n";
   }
}

https://php.net/splfileinfo.getextension