2008-10-22 17 views

Répondre

25

Vérifiez la Standard PHP Library (alias SPL) pour DirectoryIterator.

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

(Pour votre information, il y a une fonction non documentée appelée iterator_count() mais sans doute préférable de ne pas compter sur elle pour l'instant j'imagine et vous aurez besoin de filtrer des choses invisibles comme ... et .. de toute façon.)

+2

C'est ce que j'allais poster. Je pense que votre solution est la voie à suivre. – Stuart

+0

AWSOME! Exactement ce que je cherchais! – PHLAK

0

Votre réponse semble à peu près aussi simple que vous pouvez l'obtenir. Je ne peux pas penser à un chemin plus court en PHP ou en Perl.

Vous pouvez utiliser une commande système/exec impliquant ls, wc et grep si vous utilisez Linux selon la complexité de isImage(). Quoi qu'il en soit, je pense que ce que vous avez est assez suffisant. Vous devez seulement écrire la fonction une fois.

+0

J'essaie d'éviter System et Exec (sécurité d'abord!), Mais je garderai cela à l'esprit. – PHLAK

+0

Si vous trouvez que votre fonction isImage() et la méthode actuelle sont lentes, je pense que faire un ls et le rediriger vers wc -l pourrait être plus rapide. Je ne ferais que si votre méthode actuelle est lente cependant, parce que votre droit sur les raisons de sécurité pour ne pas utiliser le système/exec. – GnomeCubed

13

Cela vous donnera le compte de ce qui est dans votre répertoire. Je vais quitter la partie sur le fait de ne compter que les images que je suis sur le point de tomber sur aaasssllleeelppppppzzzzzzzzzzzzz.

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

lol nice one –

3

vous pouvez utiliser glob ...

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

ou, je ne sais pas comment cela répondre à vos besoins, mais vous pouvez le faire:

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

Vous pourrait également utiliser le SPL pour filtrer le contenu d'un DirectoryIterator en utilisant 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 façon dont vous devez utiliser ce code, il serait plus judicieux de déplacer la fonction isImage dans la classe ImageIterator d'avoir tout soigneusement enveloppé dans un seul endroit.

3

Le code ci-dessus

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

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

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

i faites-le comme ceci:

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

mais il compte aussi le. et

+0

Il récupère également les dossiers, donc pour autant que je sache, vous devez parcourir le tableau '$ files' et vérifier s'il s'agit d'un fichier utilisant' is_file'. – Brian

0

Je l'utilise pour retourner un compte de TOUS les fichiers dans un répertoire sauf. et ..

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

Voici a good list of glob filters à des fins de comparaison des fichiers.

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

if ($nfiles !== FALSE){ 

    return count($nfiles); 

} else { 

    return 0; 

} 
1

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

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

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