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

8

使用PHP,我如何在文件夹或其子文件夹中查找所有的.php文件(无论深度如何)?

4个回答

36
你可以使用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;
    }
}

8
只需添加类似以下的代码:
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__));

2

我对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);

提供的代码未返回一致的结果 - 这意味着什么?您的实现行为有何不同? - Mark Amery

0

这与另一个答案类似,但删除了 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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接