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).
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.
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!
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);
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.