简体   繁体   English

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

[英]Find all .php files in folder recursively

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

You can use RecursiveDirectoryIterator and RecursiveIteratorIterator :您可以使用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;
    }
}

just add something like:只需添加如下内容:

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__));

Very late.很晚了。 But I think this will be useful for those that landed here after a search.但我认为这对那些在搜索后登陆这里的人有用。

I modified the code a bit created by supajason Because the code provided did not return a consistent result: Mainly due to the nomenclature used.我修改了supajason创建的代码因为提供的代码没有返回一致的结果:主要是由于使用的命名法。

I also added some functionality.我还添加了一些功能。

Hope it is useful!希望有用!

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


///########-------------------------------------------------------------
///########-------------------------------------------------------------
///######## FUNCTION TO LIST ALL FILES AND FOLDERS WITHIN A CERTAIN PATH
///########-------------------------------------------------------------
///########-------------------------------------------------------------
function listFolderFiles(
                            $dir,                   /// **** TARGET DIRECTORY TO SCAN
                            $ReturnFlat = 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 *)
    $FilesFolders       = scandir($dir);        /// **** SCAN FOR ALL FILES AND FOLDERS
    $NestedFolders      = array();              /// **** THE NESTED FOLDERS BUILD ARRAY
    static $TotalFiles  = array();              /// **** THE TOTAL FILES ARRAY

    ///######## MAKE SURE THAT THE STATIC FILES ARE WILL BE CLEARED AFTER THE FIRST ITERATION
    if($iteration === 0){
        ///######### RESET AS EMPTY ARRAY
        $TotalFiles = array();
    }
    ///########==================================================



    ///########==================================================
    ///######## RUN THROUGH ALL FILES AND FOLDERS
    ///########==================================================
    foreach($FilesFolders as $File){
        if(
            /// **** IF NOT ONE DIR UP
                ($File != '.')
            &&
            /// **** IF NOT TWO DIRS UP
                ($File != '..')
            ){
            ///######### IF IT CONCERNS A FILE
            if(is_dir($dir.'/'.$File) === true){
                $iteration++;                                                                               /// **** RAISE THE ITERATION
                $NestedFolders[]        = listFolderFiles($dir.'/'.$File, false, $iteration);    /// **** EXECUTE THE FUNCTION ITSELF
            }
            ///######### IF IT CONCERNS A FILE
            else{
                $TotalFiles[]       = $dir.'/'.$File;   /// **** ADD THE FILE TO THE TOTAL FILES ARRAY
                $NestedFolders[]    = $File;            /// **** ADD THE FILE TO THE NESTED FOLDERS ARRAY
            }
        }
    }
    ///########==================================================



    ///####### IF A FLAT LIST SHOULD BE RETURNED
    if($ReturnFlat === true){
        ///########==================================================
        ///######## RETURN ALL FILES AND FOLDERS IN A FLAT ARRAY
        ///########==================================================
        return($TotalFiles);
        ///########==================================================
    }
    ///######## IF A NESTED LIST SHOULD BE RETURNED
    else{
        ///########==================================================
        ///######## RETURN THE FILES AND FOLDERS IN A NESTED ARRAY
        ///########==================================================
        return($NestedFolders);
        ///########==================================================
    }
}

$files = listFolderFiles(ROOT, true);  /// **** FLAT ARRAY
///$files = listFolderFiles(ROOT, false);  /// **** NESTED ARRAY

echo print_r($files, true);
?>

This is similar to another answer here, but removes SKIP_DOTS as its not needed, and and works with strict_types :这类似于此处的另一个答案,但删除了SKIP_DOTS ,并与strict_types一起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 https://php.net/splfileinfo.getextension

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM