递归php数组失败

时间:2017-10-07 17:02:28

标签: php recursive-query

我正在尝试创建一个递归函数,它返回按所在目录分组的所有文件。我的文件结构是这样的

.
|-- Dir A
|   +-- file 1
|   +-- file 2
|-- Dir B
|   +-- file 11
|   +-- file 12         

我希望得到的数组是

array[0][0] = Dir A
array[0][1] = file 1
array[0][2] = file 2

array[1][0] = Dir B
array[1][1] = file 11
array[1][2] = file 12

虽然echo我已经证明它找到了所有这些,但最终的数组看起来像这样:

array[0][0] = Dir A
array[1][0] = Dir B

因此文件没有存储在数组中,或者可能被覆盖,但我找不到错误。有人请指出来吗?我的功能如下。

 function GetAllFiles($dir = '.', $fileArray = '', $idx = -1){

     if ($fileArray == '') $fileArray = array();

        if(is_dir($dir)) {
         if($dh = opendir($dir)){
             while($file = readdir($dh)) {
                 if($file != '.' && $file != '..'){
                     if(is_dir($dir . $file)){
                         $idx++;
                         echo 'A '.$idx . ' - ' .$dir . $file.'<br>';
                         $fileArray[$idx][] = $dir . $file;
                         GetAllFiles($dir . $file . '/', $fileArray, $idx);
                     }else{
                         echo 'B '.$idx. ' - ' .$dir . $file.'<br>';   
                         $fileArray[$idx][] = $dir . $file;
                     }
                 }
              }
          }
          closedir($dh);         
      }

      return     $fileArray;
  }

2 个答案:

答案 0 :(得分:1)

在我做了一些修改后,这是有效的:

EXIF

鉴于文件树:

HEIF

它产生输出:

<?php

function GetAllFiles($dir) {
    $fileTree = [];

    if (is_dir($dir) && ($dh = opendir($dir))) {
       while ($node = readdir($dh)) {
           if (is_dir($dir . '/' . $node)) {
               if(!in_array($node, ['.', '..'])) {
                   $fileTree[] = GetAllFiles($dir . '/' . $node);
                   array_unshift($fileTree[count($fileTree)-1], $node);
               }
           } else {
               $fileTree[] = $node;
           }
        }
        closedir($dh);
    }

    return $fileTree;
}

print_r(GetAllFiles('tree'));

基本上是:

tree
tree/file1
tree/file2
tree/folder1
tree/folder1/file11
tree/folder1/file12
tree/folder2
tree/folder2/file21
tree/folder2/file22
tree/folder2/folder23
tree/folder2/folder23/file231
tree/folder2/folder23/file233
tree/folder2/folder23/file232

答案 1 :(得分:0)

echo 'B '.$idx. ' - ' .$dir . $file.'<br>';   
 array_push($[$idx],$dir.$file);