递归功能扫描文件夹并将其存储在数组中

时间:2014-07-30 08:09:47

标签: php arrays recursion

我正在尝试创建一个递归函数来遍历我在参数中给出的所有文件夹路径。

我想要做的是将文件夹树存储到一个数组中,例如我有Folder1,这个文件夹包含4个文本文件和另一个文件夹,我希望结构是一个多维数组,如下所示

Array 1 = Folder one
   Array 1 = text.text.....So on so forth

我有以下功能,但是它不能正常工作。我知道我需要检查它是否在根目录中,但是当它变得递归时它会变得更加困难

function displayAllFolders($root)
{
    $foldersArray = array();
    $listFolderFile = scandir($root);
    foreach($listFolderFile as $row)
    {
        if($row == "." || $row == "..")
        {
            continue;
        }
        elseif(is_dir("$root/$row") == true)
        {
            $foldersArray["$root/$row"] = "$row";
            $folder = "$root/$row";
            #$foldersArray[] = displayAllFolders("$root/$row");
        }
        else
        {
            $foldersArray[]= array("$root/$row") ;
        }
    }
        var_dump($foldersArray);
}

3 个答案:

答案 0 :(得分:3)

RecursiveDirectoryIteratorRecursiveIteratorIterator一起使用变得相当容易,例如:

$it = new RecursiveIteratorIterator(
  new RecursiveDirectoryIterator(
    // root dir
    '.',

    // ignore dots
    RecursiveDirectoryIterator::SKIP_DOTS
  ),

  // include directories
  RecursiveIteratorIterator::SELF_FIRST

  // default is:
  //   RecursiveIteratorIterator::LEAVES_ONLY
  //
  // which would only list files
);

foreach ($it as $entry) {
  /* @var $entry \SplFileInfo */
  echo $entry->getPathname(), "\n";
}

答案 1 :(得分:0)

你的方法根本不是递归的。

如果在目录的情况下再次调用相同的函数,那将是递归的。你只进行一次扫描。

看看这里:

http://php.net/manual/en/function.scandir.php

发布了一些解决方案。我建议你从mmda dot nl的usercomment开始。 (函数名为dirToArray,正是您尝试做的。) 如果它将被删除,我将其粘贴在这里:

function dirToArray($dir) {  
   $result = array();
   $cdir = scandir($dir);
   foreach ($cdir as $key => $value) {
      if (!in_array($value,array(".","..")))  {
         if (is_dir($dir . DIRECTORY_SEPARATOR . $value))  {
            $result[$value] = dirToArray($dir . DIRECTORY_SEPARATOR . $value);
         }
         else {
            $result[] = $value;
         }
      }
   }  
   return $result;
} 

答案 2 :(得分:0)

为什么不使用PHP本身?只需看看标准php库(SPL)的RecursiveDirectoryIterator。

$folders = [];
$iterator = new RecursiveDirectoryIterator(new RecursiveDirectoryIterator($directory));
iterator_apply($iterator, 'scanFolders', array($iterator, $folders));

function scanFolders($iterator, $folders) {
    while ($iterator->valid()) {
        if ($iterator->hasChildren()) {
            scanFolders($iterator->getChildren(), $folders);
        } else {
            $folders[] = $iterator->current();
        }
        $iterator->next();
    }
}