teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

8

変更

2021/07/26 07:02

投稿

mpyw
mpyw

スコア5223

answer CHANGED
@@ -14,8 +14,8 @@
14
14
  // リーフノードだけに絞り込むようにラップ
15
15
  $iter = new \RecursiveIteratorIterator($iter);
16
16
 
17
- // ファイルかつ $ext が拡張子にマッチするものだけに絞り込むようにラップ
17
+ // $ext が拡張子にマッチするファイルだけに絞り込むようにラップ
18
- $filter = fn (\SplFileInfo $f) => $f->isFile() && $f->getExtension($ext);
18
+ $filter = fn (\SplFileInfo $f) => !$f->isDir() && $f->getExtension($ext);
19
19
  return new \CallbackFilterIterator($iter, $filter);
20
20
  }
21
21
 

7

不要

2021/07/26 07:02

投稿

mpyw
mpyw

スコア5223

answer CHANGED
@@ -8,8 +8,8 @@
8
8
  */
9
9
  function getFilesOfExt(string $dir, string $ext): \CallbackFilterIterator
10
10
  {
11
- // 再帰可能イテレータを作成し, 「.」「..」は無視するように設定
11
+ // 再帰可能イテレータを作成し
12
- $iter = new \RecursiveDirectoryIterator($dir, \FileSystemIterator::SKIP_DOTS);
12
+ $iter = new \RecursiveDirectoryIterator($dir);
13
13
 
14
14
  // リーフノードだけに絞り込むようにラップ
15
15
  $iter = new \RecursiveIteratorIterator($iter);

6

配列化

2021/07/26 06:53

投稿

mpyw
mpyw

スコア5223

answer CHANGED
@@ -24,4 +24,13 @@
24
24
  // $file は SplFileInfo オブジェクト
25
25
  var_dump($file->getFilename());
26
26
  }
27
+
28
+ // 一気に配列化したい場合はこれで
29
+ $files = iterator_to_array(getFilesOfExt('/var/www/php', 'php'), false);
30
+
31
+ // 配列化+ファイル名だけ取り出す場合はこれで
32
+ $files = array_map(
33
+ fn (\SplFileInfo $file) => $file->getFilename(),
34
+ iterator_to_array(getFilesOfExt('/var/www/php', 'php'), false)
35
+ );
27
36
  ```

5

typo

2021/07/26 06:50

投稿

mpyw
mpyw

スコア5223

answer CHANGED
@@ -10,11 +10,13 @@
10
10
  {
11
11
  // 再帰可能イテレータを作成し, 「.」「..」は無視するように設定
12
12
  $iter = new \RecursiveDirectoryIterator($dir, \FileSystemIterator::SKIP_DOTS);
13
+
13
14
  // リーフノードだけに絞り込むようにラップ
14
15
  $iter = new \RecursiveIteratorIterator($iter);
16
+
15
17
  // ファイルかつ $ext が拡張子にマッチするものだけに絞り込むようにラップ
16
18
  $filter = fn (\SplFileInfo $f) => $f->isFile() && $f->getExtension($ext);
17
- return new \CallbackFilterIterator($dir, $filter);
19
+ return new \CallbackFilterIterator($iter, $filter);
18
20
  }
19
21
 
20
22
  // これで実行

4

syntax error

2021/07/26 06:47

投稿

mpyw
mpyw

スコア5223

answer CHANGED
@@ -6,16 +6,19 @@
6
6
  * @param strint $ext
7
7
  * @return \CallbackFilterIterator|\SplFileInfo[]
8
8
  */
9
- function getFileOfExt(string $dir, string $ext): \CallbackFilterIterator
9
+ function getFilesOfExt(string $dir, string $ext): \CallbackFilterIterator
10
10
  {
11
+ // 再帰可能イテレータを作成し, 「.」「..」は無視するように設定
11
12
  $iter = new \RecursiveDirectoryIterator($dir, \FileSystemIterator::SKIP_DOTS);
13
+ // リーフノードだけに絞り込むようにラップ
12
14
  $iter = new \RecursiveIteratorIterator($iter);
15
+ // ファイルかつ $ext が拡張子にマッチするものだけに絞り込むようにラップ
13
- $filter = fn (\SplFileInfo $f) => $f->isFile() && $f->getExtension($ext));
16
+ $filter = fn (\SplFileInfo $f) => $f->isFile() && $f->getExtension($ext);
14
17
  return new \CallbackFilterIterator($dir, $filter);
15
18
  }
16
19
 
17
20
  // これで実行
18
- foreach (getFileOfExt('/var/www/php', 'php') as $file) {
21
+ foreach (getFilesOfExt('/var/www/php', 'php') as $file) {
19
22
  // $file は SplFileInfo オブジェクト
20
23
  var_dump($file->getFilename());
21
24
  }

3

isFile 必要

2021/07/26 06:46

投稿

mpyw
mpyw

スコア5223

answer CHANGED
@@ -10,7 +10,7 @@
10
10
  {
11
11
  $iter = new \RecursiveDirectoryIterator($dir, \FileSystemIterator::SKIP_DOTS);
12
12
  $iter = new \RecursiveIteratorIterator($iter);
13
- $filter = fn (\SplFileInfo $current) => $current->getExtension($ext));
13
+ $filter = fn (\SplFileInfo $f) => $f->isFile() && $f->getExtension($ext));
14
14
  return new \CallbackFilterIterator($dir, $filter);
15
15
  }
16
16
 

2

PHP 7.4

2021/07/26 06:44

投稿

mpyw
mpyw

スコア5223

answer CHANGED
@@ -10,9 +10,7 @@
10
10
  {
11
11
  $iter = new \RecursiveDirectoryIterator($dir, \FileSystemIterator::SKIP_DOTS);
12
12
  $iter = new \RecursiveIteratorIterator($iter);
13
- $filter = function (\SplFileInfo $current) use ($ext) {
14
- return $current->isFile() && $current->getExtension($ext);
13
+ $filter = fn (\SplFileInfo $current) => $current->getExtension($ext));
15
- };
16
14
  return new \CallbackFilterIterator($dir, $filter);
17
15
  }
18
16
 

1

\ 漏れ

2021/07/26 06:42

投稿

mpyw
mpyw

スコア5223

answer CHANGED
@@ -13,7 +13,7 @@
13
13
  $filter = function (\SplFileInfo $current) use ($ext) {
14
14
  return $current->isFile() && $current->getExtension($ext);
15
15
  };
16
- return new CallbackFilterIterator($dir, $filter);
16
+ return new \CallbackFilterIterator($dir, $filter);
17
17
  }
18
18
 
19
19
  // これで実行