Question

Existe-t-il un moyen meilleur / plus simple de rechercher le nombre d'images dans un répertoire et de les exporter en variable?

function dirCount($dir) {
  $x = 0;
  while (($file = readdir($dir)) !== false) {
    if (isImage($file)) {$x = $x + 1}
  }
  return $x;
}

Cela semble être un long chemin, n'y a-t-il pas un moyen plus simple?

Remarque: la fonction isImage () renvoie true si le fichier est une image.

Était-ce utile?

La solution

Consultez la bibliothèque PHP standard (SPL) pour DirectoryIterator:

$dir = new DirectoryIterator('/path/to/dir');
foreach($dir as $file ){
  $x += (isImage($file)) ? 1 : 0;
}

(Pour info, il existe une fonction non documentée appelée iterator_count (), mais il est probablement préférable de ne pas compter dessus pour le moment. J'imagine. Et vous auriez besoin de filtrer les éléments invisibles comme. et de toute façon.)

Autres conseils

Cela vous donnera le décompte de ce qui est dans votre répertoire. Je vous laisserai le soin de ne compter que des images, car je suis sur le point de tomber dans mon cas.

iterator_count(new DirectoryIterator('path/to/dir/'));

je le fais comme ça:

$files = scandir($dir);
$x = count($files);
echo $x;

mais ça compte aussi le. et ..

Le code susmentionné

$count = count(glob("*.{jpg,png,gif,bmp}"));

est votre meilleur, mais le bit {jpg, png, gif} ne fonctionnera que si vous ajoutez le drapeau GLOB_BRACE à la fin:

$count = count(glob("*.{jpg,png,gif,bmp}", GLOB_BRACE));

vous pouvez utiliser glob ...

$count = 0;
foreach (glob("*.*") as $file) {
    if (isImage($file)) ++$count;
}

ou, je ne sais pas si cela conviendrait à vos besoins, mais vous pouvez le faire:

$count = count(glob("*.{jpg,png,gif,bmp}"));

Vous pouvez également utiliser la SPL pour filtrer le contenu d'un DirectoryIterator à l'aide de votre fonction isImage en étendant la classe abstraite FilterIterator .

class ImageIterator extends FilterIterator {

    public function __construct($path)
    {
        parent::__construct(new DirectoryIterator($path));
    }

    public function accept()
    {
        return isImage($this->getInnerIterator());
    }
}

Vous pouvez ensuite utiliser iterator_count (ou implémenter l'interface Countable et utiliser la fonction native count ) pour déterminer le nombre d'images. Par exemple:

$images = new ImageIterator('/path/to/images');
printf('Found %d images!', iterator_count($images));

En utilisant cette approche, selon la manière dont vous devez utiliser ce code, il pourrait être plus logique de déplacer la fonction isImage dans la classe ImageIterator pour que tout soit parfaitement encapsulé. au même endroit.

J'utilise ce qui suit pour obtenir le nombre de tous les types de fichiers dans un répertoire de Laravel

   $dir = public_path('img/');
    $files = glob($dir . '*.*');

    if ( $files !== false )
    {
        $total_count = count( $files );
        return $totalCount;
    }
    else
    {
        return 0;
    }

Votre réponse semble à peu près aussi simple que possible. Je ne peux pas penser à un moyen plus court de le faire, ni en PHP ni en Perl.

Vous pourrez peut-être utiliser une commande system / exec impliquant ls, wc et grep si vous utilisez Linux, en fonction de la complexité de isImage ().

Quoi qu'il en soit, je pense que ce que vous avez est tout à fait suffisant. Vous n'avez qu'à écrire la fonction une fois.

Je l'utilise pour renvoyer un nombre de TOUS les fichiers d'un répertoire sauf. et ..

return count(glob("/path/to/file/[!\.]*"));

Voici une bonne liste de filtres globaux à des fins de correspondance de fichiers.

$nfiles = glob("/path/to/file/[!\\.]*");

if ($nfiles !== FALSE){

    return count($nfiles);

} else {

    return 0;

}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top