PHPで特定のディレクトリのサブディレクトリをすべて取得する方法
PHPで特定のディレクトリに含まれるすべてのサブディレクトリ(子ディレクトリ)を取得したい場合は、標準関数の glob() を使うのが最も手軽です。この記事では、目的に応じて使い分けられる代表的な2つの方法を、実際のコード例とともにわかりやすく解説します。
方法1:glob()とarray_filter()を組み合わせる
glob() で対象ディレクトリ直下のエントリ一覧を取得し、array_filter() のコールバックとして is_dir を渡すことで、ディレクトリだけを抽出できます。
サンプルコード
<?php
// カレントディレクトリ直下のサブディレクトリのみを抽出
$all_sub_dirs = array_filter(glob('*'), 'is_dir');
print_r($all_sub_dirs);
?>
出力例
Array (
[0] => example
[1] => exam
[2] => log
)
注意点: パターンは '*' を指定してください。'*.*' とすると「ドットを含む名前」にしかマッチせず、拡張子を持たない通常のディレクトリが取得結果から漏れてしまうことがあります。
方法2:GLOB_ONLYDIRフラグを使う(おすすめ)
ディレクトリだけが必要な場合は、glob() の第2引数に GLOB_ONLYDIR を指定する方法が最もシンプルです。後からフィルタリングするコードが不要になり、意図も明確になります。
サンプルコード
<?php
// $somePath で指定したディレクトリ直下のサブディレクトリを取得
$all_dirs = glob($somePath . '/*', GLOB_ONLYDIR);
print_r($all_dirs);
?>
出力例
Array (
[0] => /path/to/example
[1] => /path/to/exam
[2] => /path/to/log
)
補足:利用時のポイント
- 並び順:
glob()はマッチしたパスをアルファベット昇順でソートした配列として返します。 - 戻り値の形式: 相対パスで指定すれば相対パスのまま、絶対パスで指定すれば絶対パスで返されます。
- 該当なしの場合: マッチするものがないときは空の配列が返るため、
empty()などでチェックしておくと安全です。
さらに深い階層まで再帰的に取得したい場合
glob() は直下の1階層しか走査しません。サブディレクトリの中身までまとめて取得したい場合は、RecursiveDirectoryIterator と RecursiveIteratorIterator を組み合わせます。
<?php
$iterator = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($somePath, FilesystemIterator::SKIP_DOTS),
RecursiveIteratorIterator::SELF_FIRST
);
foreach ($iterator as $fileinfo) {
if ($fileinfo->isDir()) {
echo $fileinfo->getPathname() . PHP_EOL;
}
}
?>
まとめ
直下のサブディレクトリだけであれば glob($path . '/*', GLOB_ONLYDIR) 一行で十分ですが、柔軟な条件での絞り込みには array_filter() + is_dir、再帰的な走査には RecursiveDirectoryIterator が便利です。用途に応じて使い分けてください。
-
Pythonでセットから指定したサイズのすべての部分集合を取得する方法
この記事では、Pythonを使ってセット(集合)から指定したサイズ n のすべての部分集合(サブセット)を取得する方法について解説します。 問題文 問題:あるセットが与えられたとき、その中からサイズ n のすべての部分集合を列挙する必要があります。 この問題は、Pythonの標準ライブラリである itertools を活用することで、複数の方法で解決できます。ここでは代表的な3つのアプローチを順番に紹介します。 方法1:itertools.combinations() メソッドを使う itertools.combinations() は、イテラブルから指定した長さのすべての組み合わせをタプルと
-
Pythonでセットから指定サイズのすべての部分集合(サブセット)を取得する方法
この記事では、Pythonを使ってセット(set)から指定したサイズのすべての部分集合(サブセット)を取得する方法を解説します。 問題の概要 あるセットと整数 n が与えられたとき、要素数がちょうど n 個になる部分集合をすべて求めて表示します。 この問題は、Pythonの標準ライブラリ itertools に含まれる combinations() 関数を使うことで簡潔に解決できます。この関数は、イテラブルから長さ r の組み合わせをすべて列挙してくれるため、部分集合の生成に最適です。また、セットには重複した要素が格納されないため、重複を含むリテラルからセットを作成しても、自動的に一意な要