使用PHP递归函数列出目录中的所有文件和文件夹

use*_*869 68 php recursion

我正在尝试浏览目录中的所有文件,如果有目录,请浏览所有文件,依此类推,直到没有更多目录要去.每个处理过的项目都将添加到下面函数的结果数组中.虽然我不知道我能做什么/我做错了什么但它不能正常工作,但是当处理下面的代码时,浏览器运行得非常慢,感谢任何帮助!

码:

    function getDirContents($dir){
        $results = array();
        $files = scandir($dir);

            foreach($files as $key => $value){
                if(!is_dir($dir. DIRECTORY_SEPARATOR .$value)){
                    $results[] = $value;
                } else if(is_dir($dir. DIRECTORY_SEPARATOR .$value)) {
                    $results[] = $value;
                    getDirContents($dir. DIRECTORY_SEPARATOR .$value);
                }
            }
    }

    print_r(getDirContents('/xampp/htdocs/WORK'));
Run Code Online (Sandbox Code Playgroud)

A-3*_*312 121

获取目录中的所有文件和文件夹,不要在有.或时调用函数...

你的代码:

<?php
function getDirContents($dir, &$results = array()){
    $files = scandir($dir);

    foreach($files as $key => $value){
        $path = realpath($dir.DIRECTORY_SEPARATOR.$value);
        if(!is_dir($path)) {
            $results[] = $path;
        } else if($value != "." && $value != "..") {
            getDirContents($path, $results);
            $results[] = $path;
        }
    }

    return $results;
}

var_dump(getDirContents('/xampp/htdocs/WORK'));
Run Code Online (Sandbox Code Playgroud)

输出(例子):

array (size=12)
  0 => string '/xampp/htdocs/WORK/iframe.html' (length=30)
  1 => string '/xampp/htdocs/WORK/index.html' (length=29)
  2 => string '/xampp/htdocs/WORK/js' (length=21)
  3 => string '/xampp/htdocs/WORK/js/btwn.js' (length=29)
  4 => string '/xampp/htdocs/WORK/js/qunit' (length=27)
  5 => string '/xampp/htdocs/WORK/js/qunit/qunit.css' (length=37)
  6 => string '/xampp/htdocs/WORK/js/qunit/qunit.js' (length=36)
  7 => string '/xampp/htdocs/WORK/js/unit-test.js' (length=34)
  8 => string '/xampp/htdocs/WORK/xxxxx.js' (length=30)
  9 => string '/xampp/htdocs/WORK/plane.png' (length=28)
  10 => string '/xampp/htdocs/WORK/qunit.html' (length=29)
  11 => string '/xampp/htdocs/WORK/styles.less' (length=30)
Run Code Online (Sandbox Code Playgroud)


zka*_*oca 85

$rii = new RecursiveIteratorIterator(new RecursiveDirectoryIterator('path/to/folder'));

$files = array(); 

foreach ($rii as $file) {

    if ($file->isDir()){ 
        continue;
    }

    $files[] = $file->getPathname(); 

}



var_dump($files);
Run Code Online (Sandbox Code Playgroud)

这将为您带来所有带路径的文件.

  • 也可以使用[RecursiveDirectoryIterator :: SKIP_DOTS](http://php.net/manual/ro/class.filesystemiterator.php#filesystemiterator.constants.skip-dots)来避免继续 (4认同)
  • 或者你可以改变条件:`if(!$ file-> isDir())$ files [] = $ file-> getPathname();`.保存一行. (2认同)

A-3*_*312 23

这是更短的版本:

function getDirContents($path) {
    $rii = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path));

    $files = array(); 
    foreach ($rii as $file)
        if (!$file->isDir())
            $files[] = $file->getPathname();

    return $files;
}

var_dump(getDirContents($path));
Run Code Online (Sandbox Code Playgroud)

  • 拒绝投票,因为这并不是真正的改进。只是相同的答案写的略有不同。它归结为风格问题。保护子句(zkanoca的版本)绝对可以。 (2认同)
  • Zkanoca的版本很好,你的回答并不是真的需要,评论就足够了.这归结为编码风格. (2认同)

bma*_*ovu 8

如果您希望将目录内容作为数组获取,而忽略隐藏的文件和目录,这可能会有所帮助。

function dir_tree($dir_path)
{
    $rdi = new \RecursiveDirectoryIterator($dir_path);

    $rii = new \RecursiveIteratorIterator($rdi);

    $tree = [];

    foreach ($rii as $splFileInfo) {
        $file_name = $splFileInfo->getFilename();

        // Skip hidden files and directories.
        if ($file_name[0] === '.') {
            continue;
        }

        $path = $splFileInfo->isDir() ? array($file_name => array()) : array($file_name);

        for ($depth = $rii->getDepth() - 1; $depth >= 0; $depth--) {
            $path = array($rii->getSubIterator($depth)->current()->getFilename() => $path);
        }

        $tree = array_merge_recursive($tree, $path);
    }

    return $tree;
}
Run Code Online (Sandbox Code Playgroud)

结果会是这样的;

dir_tree(__DIR__.'/public');

[
    'css' => [
        'style.css',
        'style.min.css',
    ],
    'js' => [
        'script.js',
        'script.min.js',
    ],
    'favicon.ico',
]
Run Code Online (Sandbox Code Playgroud)

来源


A-3*_*312 7

获取带有过滤器 (第二个参数)的所有文件和目录中的文件夹,不要在有.或时调用函数...

你的代码:

<?php
function getDirContents($dir, $filter = '', &$results = array()) {
    $files = scandir($dir);

    foreach($files as $key => $value){
        $path = realpath($dir.DIRECTORY_SEPARATOR.$value); 

        if(!is_dir($path)) {
            if(empty($filter) || preg_match($filter, $path)) $results[] = $path;
        } elseif($value != "." && $value != "..") {
            getDirContents($path, $filter, $results);
        }
    }

    return $results;
} 

// Simple Call: List all files
var_dump(getDirContents('/xampp/htdocs/WORK'));

// Regex Call: List php files only
var_dump(getDirContents('/xampp/htdocs/WORK', '/\.php$/'));
Run Code Online (Sandbox Code Playgroud)

输出(例子):

// Simple Call
array(13) {
  [0]=> string(69) "/xampp/htdocs/WORK.htaccess"
  [1]=> string(73) "/xampp/htdocs/WORKConverter.php"
  [2]=> string(69) "/xampp/htdocs/WORKEvent.php"
  [3]=> string(70) "/xampp/htdocs/WORKdefault_filter.json"
  [4]=> string(68) "/xampp/htdocs/WORKdefault_filter.xml"
  [5]=> string(80) "/xampp/htdocs/WORKCaching/ApcCache.php"
  [6]=> string(84) "/xampp/htdocs/WORKCaching/CacheFactory.php"
}

// Regex Call
array(13) {
  [0]=> string(69) "/xampp/htdocs/WORKEvent.php"
  [1]=> string(73) "/xampp/htdocs/WORKConverter.php"
  [2]=> string(80) "/xampp/htdocs/WORKCaching/ApcCache.php"
  [3]=> string(84) "/xampp/htdocs/WORKCaching/CacheFactory.php"
}
Run Code Online (Sandbox Code Playgroud)

詹姆斯卡梅隆的主张.


pat*_*ato 7

我没有丑陋的“foreach”控制结构的建议是

$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path));
$allFiles = array_filter(iterator_to_array($iterator), function($file) {
    return $file->isFile();
});
Run Code Online (Sandbox Code Playgroud)

您可能只想提取文件路径,您可以这样做:

array_keys($allFiles);
Run Code Online (Sandbox Code Playgroud)

仍然是 4 行代码,但比使用循环或其他东西更直接。


Kou*_*Das 5

这是我想出的,并且没有太多代码行

function show_files($start) {
    $contents = scandir($start);
    array_splice($contents, 0,2);
    echo "<ul>";
    foreach ( $contents as $item ) {
        if ( is_dir("$start/$item") && (substr($item, 0,1) != '.') ) {
            echo "<li>$item</li>";
            show_files("$start/$item");
        } else {
            echo "<li>$item</li>";
        }
    }
    echo "</ul>";
}

show_files('./');
Run Code Online (Sandbox Code Playgroud)

它输出类似的东西

..idea
.add.php
.add_task.php
.helpers
 .countries.php
.mysqli_connect.php
.sort.php
.test.js
.test.php
.view_tasks.php
Run Code Online (Sandbox Code Playgroud)

** 这些点是无序列表的点。

希望这可以帮助。