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

时间:2014-04-21 13:54:22

标签: php arrays function recursion file-structure

我写了一个php function,通过该files我想要一个特定directories中所有directory/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 的数组。


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

array


2)我想要的是files 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 ) ) -

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


3)我得到的东西(只有1级) -

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


4)我的功能 -

{{1}}


我在这里错过了什么?帮助将不胜感激。谢谢你:)

4 个答案:

答案 0 :(得分:4)

使用您的路径切换$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);

有关详细信息,请参阅PHP文档:RecursiveDirectoryIteratorRecursiveIteratorIterator&amp; SplFileInfo是很好的起点!

答案 1 :(得分:1)

使用FilesystemIterator可能会更快一点:

function getDirectoryList($dir) {
    $dirList = $fileList = array();
    $iter = new FilesystemIterator($dir, FilesystemIterator::SKIP_DOTS);

    foreach($iter as $file) {
        if($file->isDir()) {
            $dirList[$file->getFilename()] = getDirectoryList($file->getPathname());
        } else {
            $fileList[$file->getFilename()] = $file->getFilename();
        }
    }
    uksort($dirList, "strnatcmp");
    natsort($fileList);
    return $dirList + $fileList;
}

此函数将为您提供一个与目录结构完全相同的多维数组,也可以更容易使用。

答案 2 :(得分:0)

它是递归调用,您可以将返回值附加到数组或 处理数组引用:

if(is_dir($new_dir))
{
    $arr['directories'][] = $new_dir;
    get_files_directories($new_dir, $arr); //assign or return
}

-

function get_files_directories($directory, &$arr) 

答案 3 :(得分:0)

您应该指定从重复调用返回的“arr”,或者您应该通过引用传入数组。 (参见参考文献:http://php.net/manual/en/language.references.pass.php

通过引用传递:get_files_directories($ new_dir,&amp; $ arr);

相关问题