63108


お世話になります。  
PHPでディレクトリ内のディレクトリ一覧をすべて取得したく、下記のようなコードを作成しました。  
しかし、取得した結果が空の配列になってしまいます。  
下記のコードで間違っている点等、何かアドバイスをいただけますと幸いです。

## ソースコード

[code]

    function get_all_dir($dir){
      $list = array();
      $dirs = glob(rtrim($dir, "/")."/*", GLOB_ONLYDIR|GLOB_ERR);
      foreach ($dirs as $value){
        if (is_dir($value)){
          $list = array_merge($list, get_all_dir($value));
        }
      }
      return $list;
    }
    
    var_dump(get_all_dir("./test"));
    
[/code]

## 実行結果

[code]

    array(0) { }
    
[/code]

## 環境

PHP7.4.1

* * *

以上、よろしくお願いいたします。


CC BY-SA 4.0
2020-02-17T04:55:49.950
63102
2020-02-17T07:53:48.977
2020-02-17T07:01:06.677
29034
question
php
PHPでディレクトリ内のディレクトリの一覧を再帰的に取得したい


こんにちは。自分ならこうという感じですが、書いてみました。  
$listを関数の最初に初期化してるのが原因だと思います。再帰した値を保持するには参照で渡さないといけないですね。クラスならメンバ変数に格納するのもいいでしょう。  
また`..`は上位ディレクトリを表すので無視します。

[code]

    <?php
    function get_all_dir($dir,&$list){
        if($dir == '..') return;
        $dirs = glob(rtrim($dir, "/")."/*", GLOB_ONLYDIR|GLOB_ERR);
    
        foreach ($dirs as $value){
            if (is_dir($value)){
              $list[]=$value;
              get_all_dir($value,$list);
          }
        }
        return;
    }
    $list = [];
    get_all_dir(__DIR__,$list);
    print_r($list);
    
[/code]


CC BY-SA 4.0
2020-02-17T05:40:11.163
63105
2020-02-17T05:46:43.250
2020-02-17T05:46:43.250
37777
37777
63102
answer


[DirectoryIterator](https://www.php.net/manual/ja/class.directoryiterator.php)
を使って書いてみました。

[code]

    function get_all_dir($dir){
      $dirs = [];
      foreach (new DirectoryIterator($dir) as $fileInfo) {
        if($fileInfo->isDir() && ! $fileInfo->isDot() &&  ! $fileInfo->isLink()) {
          $d = rtrim($dir, '/').'/'.$fileInfo->getFilename();
          $dirs = array_merge($dirs, [$d], get_all_dir($d));
        }
      }
      return $dirs;
    }
    
    var_dump(get_all_dir('./test'));
    
[/code]


CC BY-SA 4.0
2020-02-17T07:23:39.200
63108
2020-02-17T07:53:48.977
2020-02-17T07:53:48.977
63102
answer