par
tesmet » 14 oct. 2018, 17:11
Pour éviter une boucle foreach avec if et compteur, il faut appliquer un filtre sur RecursiveDirectoryIterator en dérivant de RecursiveFilterIterator ou via une fonction avec sa classe fille RecursiveCallbackFilterIterator
function filtrer_fichier($fileinfo, $filename, $iterator) {
// les répertoires à ignorer... il y a peut-être plus simple, mais c'est l'idée
if(strpos(strtoupper($filename), DIRECTORY_SEPARATOR . 'MINIATURE' . DIRECTORY_SEPARATOR) !== false) return false;
if(strpos(strtoupper($filename), DIRECTORY_SEPARATOR . 'TEMP' . DIRECTORY_SEPARATOR) !== false) return false;
// sinon c'est accepté
return true;
}
$files = new RecursiveIteratorIterator(
new RecursiveCallbackFilterIterator( // pour filtrer via une fonction
new RecursiveDirectoryIterator(
$dossier,
FilesystemIterator::SKIP_DOTS // pas de répertoire . ou ..
),
'filtrer_fichier' // la fonction ci-haut ou par closure function($fileinfo, $filename, $iterator) {...}
)
);
echo iterator_count($files);
ou encore par un filtre regexp avec RecursiveRegexIterator
$files = new RecursiveIteratorIterator(
new RecursiveRegexIterator(
new RecursiveDirectoryIterator(
$dossier,
FilesystemIterator::SKIP_DOTS // pas de répertoire . ou ..
),
// encore une fois... il y a peut-être plus simple comme regexp, mais c'est l'idée
'#^((?[/\\\\]).)*$#i' // pas de répertoire MINIATURE ou TEMP
)
);
echo iterator_count($files);
Pour éviter une boucle foreach avec if et compteur, il faut appliquer un filtre sur RecursiveDirectoryIterator en dérivant de RecursiveFilterIterator ou via une fonction avec sa classe fille RecursiveCallbackFilterIterator
[PHP]function filtrer_fichier($fileinfo, $filename, $iterator) {
// les répertoires à ignorer... il y a peut-être plus simple, mais c'est l'idée
if(strpos(strtoupper($filename), DIRECTORY_SEPARATOR . 'MINIATURE' . DIRECTORY_SEPARATOR) !== false) return false;
if(strpos(strtoupper($filename), DIRECTORY_SEPARATOR . 'TEMP' . DIRECTORY_SEPARATOR) !== false) return false;
// sinon c'est accepté
return true;
}
$files = new RecursiveIteratorIterator(
new RecursiveCallbackFilterIterator( // pour filtrer via une fonction
new RecursiveDirectoryIterator(
$dossier,
FilesystemIterator::SKIP_DOTS // pas de répertoire . ou ..
),
'filtrer_fichier' // la fonction ci-haut ou par closure function($fileinfo, $filename, $iterator) {...}
)
);
echo iterator_count($files);[/PHP]
ou encore par un filtre regexp avec RecursiveRegexIterator
[PHP]$files = new RecursiveIteratorIterator(
new RecursiveRegexIterator(
new RecursiveDirectoryIterator(
$dossier,
FilesystemIterator::SKIP_DOTS // pas de répertoire . ou ..
),
// encore une fois... il y a peut-être plus simple comme regexp, mais c'est l'idée
'#^((?[/\\\\]).)*$#i' // pas de répertoire MINIATURE ou TEMP
)
);
echo iterator_count($files);[/PHP]