web-dev-qa-db-fra.com

Y at-il un moyen de glob () que des fichiers?

Je sais que glob peut rechercher tous les fichiers ou uniquement tous les répertoires d'un dossier:

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

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

Mais je n'ai pas trouvé quelque chose pour ne trouver que des fichiers dans une seule ligne efficacement.

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

Fonctionne bien, mais lit le répertoire deux fois (même s’il existe certaines optimisations qui rendent la seconde navigation plus rapide).

28
Alain Tiemblo

J'ai finalement trouvé une solution:

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

Attention, array_filter conservera les clés numériques: utilisez array_values ​​ si vous devez réindexer le tableau.

49
Alain Tiemblo

Il y a un moyen plus facile, juste une ligne:

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

le {*} signifie toutes les fins de fichiers, donc tous les fichiers, mais pas de dossier!

5
mulcher

Vous pouvez utiliser GLOB_BRACE pour faire correspondre des documents à une liste d'extensions de fichiers connues:

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

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

5
RafaSashi

Autre solution:

$files = glob('../{,.}*', GLOB_BRACE);
foreach ($files as $i => $file) {
    if (is_dir($file)) {
        unset($files[$i]);
    }
}

Ou:

$files = glob('../{,.}*', GLOB_BRACE | GLOB_MARK);
foreach ($files as $i => $file) {
    if ($file[ strlen($file) - 1 ] == '/') {
        unset($files[$i]);
    }
}

Les deux préservent les touches numériques afin que vous souhaitiez peut-être réindexer .

P.S. Vous devez utiliser{,.}*', GLOB_BRACE si vous voulez obtenir les fichiers cachés aussi.

1
mgutt