递归爬网文件和目录并返回多维数组

时间:2014-11-08 19:37:45

标签: php arrays recursion multidimensional-array

所以我一直在尝试创建一个递归文件目录树列表功能。除了一些错误之外,我有大部分内容。例如由于代码而重复的目录名称以及它在树中的深度不够。

function ftpFileList($ftpConnection, $path="/") {
    static $allFiles = array();
    $contents = ftp_nlist($ftpConnection, $path);
    foreach($contents as $currentFile) {
        if($currentFile !== "." && $currentFile !== ".."){
          if( strpos($currentFile,".") === false || strpos($currentFile,"." === 0) ) {
            if(!$allFiles[$path][$currentFile]){
                 $allFiles[$path][$currentFile] = array();
            }
            ftpFileList($ftpConnection,$currentFile);
         }else{
             if($currentPath !== "." && $currentPath !== "..") $allFiles[$path][] = $currentFile;
         }
      } 
   }
   return $allFiles;
}

返回的数组与此

类似
array(3) {
  [""]=>
      array(4) {
       [0]=>
        string(9) ".ftpquota"
       [1]=>
        string(9) ".htaccess"
       ["kms"]=>
        array(0) {
        }
       ["public_html"]=>
        array(0) {
        }
       }
  ["kms"]=>
     array(6) {
      [0]=>
       string(16) "admin_config.php"
      [1]=>
       string(8) "css.json"
      [2]=>
       string(10) "pages.json"
      ["php_includes"]=>
       array(0) {
       }
     ["site"]=>
       array(0) {
       }
     ["templates"]=>
       array(0) {
       }
      }
 ["public_html"]=>
   array(20) {
   [0]=>
    string(9) ".htaccess"
   [1]=>
    string(7) "404.php"
   ...
  }
}

基本上我想做的就是得到这样的东西

.htaccess
.ftpquota
 -public_html
  -folder2
   -folder3
     file.ext
  file2.ext
 -kms
  -folder4
   file3.ext
   -folder5
    -file4.ext
   file5.ext

希望你能理解我在问什么,只需要看看这里有什么问题,以及如何获得正确的索引来放置$currentFile,因为它正在搜索$allFiles[$path][$currentFile]这是不正确的。无论如何只需要一个好的递归函数来列出数组中的所有文件,目录就是索引。

2 个答案:

答案 0 :(得分:2)

我认为没有任何理由" $ allFiles"变量应该是静态的。

此外,您使用的$ currentPath变量并未在任何地方定义。你想用变量做些什么?

尝试使用此代码(它可能仍然不是完美的,但应该给你足够的提示如何进行真正的递归):

function ftpFileList($ftpConnection, $path="/") {
    $files = array();
    $contents = ftp_nlist($ftpConnection, $path);
    foreach($contents as $currentFile) {
        if($currentFile !== "." && $currentFile !== ".."){
          if( strpos($currentFile,".") === false || strpos($currentFile,"." === 0) ) {
            $files[$path][$currentFile] = ftpFileList($ftpConnection, $path.$currentFile.'/');
         }else{
             if($currentPath !== "." && $currentPath !== "..")
                 $files[$path][] = $currentFile;
         }
      } 
   }
   return $files;
}

答案 1 :(得分:1)

扩展我的评论中链接的答案,您可以将DirectoryIteratorftp:// stream wrapper

结合使用
$fileData = fillArrayWithFileNodes( new DirectoryIterator( 'ftp://path/to/root' ) );

function fillArrayWithFileNodes( DirectoryIterator $dir )
{
  $data = array();
  foreach ( $dir as $node )
  {
    if ( $node->isDir() && !$node->isDot() )
    {
      $data[$node->getFilename()] = fillArrayWithFileNodes( new DirectoryIterator( $node->getPathname() ) );
    }
    else if ( $node->isFile() )
    {
      $data[] = $node->getFilename();
    }
  }
  return $data;
}