web-dev-qa-db-ja.com

ファイルのみをglob()する方法はありますか?

glob はすべてのファイルまたはフォルダー内のすべてのディレクトリのみを検索できることを知っています。

echo "All files:\n";
$all = glob("/*");
var_dump($all);

echo "Only directories\n";
$dirs = glob("/*", GLOB_ONLYDIR);
var_dump($dirs);

しかし、1行のファイルだけを効率的に見つけるものは見つかりませんでした。

$files = array_diff(glob("/*"), glob("/*", GLOB_ONLYDIR));

うまく動作しますが、ディレクトリを2回読み取ります( 一部の最適化 があり、2番目のブラウジングが速くなる場合でも)。

33
Alain Tiemblo

私は最終的に解決策を見つけました:

echo "Only files\n";
$files = array_filter(glob("/*"), 'is_file');
var_dump($files);

しかし、注意してください array_filter は数値キーを保持します:配列のインデックスを再作成する必要がある場合は array_values を使用します。

55
Alain Tiemblo

簡単な方法があります。たった1行です。

$files = glob("/path/to/directory/*.{*}", GLOB_BRACE);

{*}はすべてのファイルの終わりを意味するため、すべてのファイルがありますが、フォルダーはありません!

3
mulcher

GLOB_BRACEを使用して、既知のファイル拡張子のリストに対してドキュメントを照合できます。

$files = glob("/path/to/directory/*.{jpg,gif,png,html,htm,php,ini}", GLOB_BRACE);

参照: http://www.electrictoolbox.com/php-glob-find-files/

3
RafaSashi

@AlainTiembloのソリューションと比較して10%高速:

_$files = array_filter(glob("/*", GLOB_MARK), function($path){ return $path[ strlen($path) - 1 ] != '/'; });
_

_GLOB_MARK_を使用して各ディレクトリにスラッシュを追加します。これにより、 array_filter() および匿名関数を使用してこれらのエントリを削除できます。

PHP 7.1.0は 負の数値インデックス をサポートしているため、代わりにこれを使用することもできます。

_$files = array_filter(glob("/*", GLOB_MARK), function($path){return $path[-1] != '/';});
_

関連する速度の向上はありませんが、stackoverflowスクロールバーの回避に役立ちます^^

array_filter()はキーを保持するので、後で array_values() を使用して配列のインデックスを再作成することを検討する必要があります。

_$files = array_values($files);
_
0
mgutt