PHP递归函数:获取一个目录及其子目录中的所有文件和目录

Par*_*us- 0 php arrays recursion function file-structure

我写了一个php function,通过它我想要一个包含所有filesdirectories在特定directory.


1) 以下是我的目录结构 -

/pages  (Full path - /home/ubuntu/projects/xyz.com/code/ciapp/views/pages)
|
|--file1.php
|--file2.php
|--file3.php
|--folder1
   |--file4.php
   |--file5.php
   |--folder2
      |--file6.php
|--folder3
   |--file7.php
   |--file8.php
Run Code Online (Sandbox Code Playgroud)


2)我希望有一个是arrayfiles and directories-

Array
(
[files] => Array
    (
        [0] => /home/ubuntu/projects/xyz.com/code/ciapp/views/pages/file1.php
        [1] => /home/ubuntu/projects/xyz.com/code/ciapp/views/pages/file2.php
        [2] => /home/ubuntu/projects/xyz.com/code/ciapp/views/pages/file3.php
        [3] => /home/ubuntu/projects/xyz.com/code/ciapp/views/pages/folder1/file4.php
        [4] => /home/ubuntu/projects/xyz.com/code/ciapp/views/pages/folder1/file5.php
        [5] => /home/ubuntu/projects/xyz.com/code/ciapp/views/pages/folder1/folder2/file6.php
        [6] => /home/ubuntu/projects/xyz.com/code/ciapp/views/pages/folder3/file7.php
        [7] => /home/ubuntu/projects/xyz.com/code/ciapp/views/pages/folder3/file8.php
    )

[directories] => Array
    (
        [0] => /home/ubuntu/projects/xyz.com/code/ciapp/views/pages/folder1
        [1] => /home/ubuntu/projects/xyz.com/code/ciapp/views/pages/folder1/folder2
        [2] => /home/ubuntu/projects/xyz.com/code/ciapp/views/pages/folder3
    )
)
Run Code Online (Sandbox Code Playgroud)


3)我得到了什么(只有1级)-

Array
(
[files] => Array
    (
        [0] => /home/ubuntu/projects/xyz.com/code/ciapp/views/pages/file1.php
        [1] => /home/ubuntu/projects/xyz.com/code/ciapp/views/pages/file2.php
        [2] => /home/ubuntu/projects/xyz.com/code/ciapp/views/pages/file3.php
    )

[directories] => Array
    (
        [0] => /home/ubuntu/projects/xyz.com/code/ciapp/views/pages/folder1
        [1] => /home/ubuntu/projects/xyz.com/code/ciapp/views/pages/folder3
    )
)
Run Code Online (Sandbox Code Playgroud)


4)我的功能 -

function get_files_directories($directory, $a = array())
{
    $dirs = scandir($directory, 1);
    $arr = $a;

    foreach($dirs as $dir)
    {
       if($dir != "." && $dir != '..')
       {
           $new_dir = $directory.'/'.$dir;
           if(is_dir($new_dir))
           {
               $arr['directories'][] = $new_dir;
               get_files_directories($new_dir, $arr);
           }
           else
           {
               $arr['files'][] = $new_dir;
           }
       }
    }

    return $arr;
}

$my_dir = "/home/ubuntu/projects/xyz.com/code/ciapp/views/pages";
$files_dirs = get_files_directories($my_dir);

echo '<pre>'; print_r($files_dirs);
Run Code Online (Sandbox Code Playgroud)


我在这里缺少什么?帮助将不胜感激。谢谢 :)

jon*_*nnu 5

切换$path您的路径,这应该可以工作。SPL 包含递归目录遍历所需的所有类,无需自行滚动。

<?php

$path   = '.';
$result = array('files' => array(), 'directories' => array());

$DirectoryIterator = new RecursiveDirectoryIterator($path);
$IteratorIterator  = new RecursiveIteratorIterator($DirectoryIterator, RecursiveIteratorIterator::SELF_FIRST);
foreach ($IteratorIterator as $file) {

    $path = $file->getRealPath();
    if ($file->isDir()) {
        $result['directories'][] = $path;
    } elseif ($file->isFile()) {
        $result['files'][] = $path;
    }

}

print_r($result);
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅 PHP 文档:RecursiveDirectoryIteratorRecursiveIteratorIteratorSplFileInfo是很好的起点!