代码之家  ›  专栏  ›  技术社区  ›  user3052443

递归php数组失败

  •  0
  • user3052443  · 技术社区  · 7 年前

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

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

    虽然回声显示它找到了所有这些,但最终的阵列如下所示:

    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 回复  |  直到 7 年前
        1
  •  1
  •   arkascha    7 年前

    在我做了一些修改后,它就可以工作了:

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

    它产生输出:

    Array
    (
        [0] => file2
        [1] => Array
            (
                [0] => folder1
                [1] => file11
                [2] => file12
            )
    
        [2] => Array
            (
                [0] => folder2
                [1] => Array
                    (
                        [0] => folder23
                        [1] => file231
                        [2] => file233
                        [3] => file232
                    )
    
                [2] => file21
                [3] => file22
            )
    
        [3] => file1
    )
    

    [0] => file2
    [1][0] => folder1
    [1][1] => file11
    [1][2] => file12
    [2][0] => folder2
    [2][1][0] => folder23
    [2][1][1] => file231
    [2][1][2] => file233
    [2][1][3] => file232
    [2][2] => file21
    [2][3] => file22
    [3] => file1
    
        2
  •  0
  •   Osama    7 年前
    echo 'B '.$idx. ' - ' .$dir . $file.'<br>';   
     array_push($[$idx],$dir.$file);