2008-10-22 11 views
12

Gibt es einen besseren/einfacheren Weg, die Anzahl der Bilder in einem Verzeichnis zu finden und sie in eine Variable auszugeben?Gibt die Gesamtzahl der Dateien in einem Ordner mit PHP zurück

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

Das scheint so ein langer Weg, dies zu tun, gibt es keinen einfacheren Weg?

Hinweis: Die isImage() - Funktion gibt True zurück, wenn die Datei ein Bild ist.

Antwort

25

Überprüfen Sie die Standard-PHP-Bibliothek (auch bekannt als SPL) für DirectoryIterator aus.

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

(FYI gibt es eine nicht dokumentierte Funktion namens iterator_count(), aber wahrscheinlich am besten nicht für jetzt darauf verlassen Ich kann mir vorstellen würde und du müsstest unsichtbare Sachen wie. und .. auf jeden Fall herausfiltern.)

+2

zu bekommen Das ist, was ich wollte zu schreiben. Ich denke, deine Lösung ist der richtige Weg. – Stuart

+0

FANTASTISCH! Genau wonach ich gesucht habe! – PHLAK

0

Deine Antwort scheint so einfach wie möglich zu sein. Ich kann mir keinen kürzeren Weg dazu in PHP oder Perl vorstellen.

Sie können möglicherweise einen System/Exec-Befehl mit ls, wc und grep, wenn Sie Linux verwenden abhängig davon, wie komplex isImage() ist.

Egal, ich denke, was Sie haben, ist völlig ausreichend. Sie müssen die Funktion nur einmal schreiben.

+0

Ich versuche, System und Exec (Sicherheit zuerst!) Zu vermeiden, aber ich werde das im Hinterkopf behalten. – PHLAK

+0

Wenn Sie finden, dass Ihre isImage() - Funktion und aktuelle Methode langsam ist, denke ich, dass ein ls zu tun und es an wc -l könnte schneller sein. Ich würde das nur tun, WENN Ihre aktuelle Methode langsam ist, weil Ihr Recht über die Sicherheitsgründe, system/exec nicht zu verwenden. – GnomeCubed

13

Dies gibt Ihnen die Anzahl der, was in Ihrem Verzeichnis ist. Ich werde den Teil über das Zählen nur der Bilder zu Ihnen verlassen, wie ich aaasssllleeelppppppzzzzzzzzzzzzz fallen werde.

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

lol nice one –

3

könnten Sie glob ...

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

oder, ich bin nicht sicher, wie gut würde dies Ihre Bedürfnisse anzupassen, aber man konnte dies tun:

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

Sie könnte auch den SPL verwenden, um den Inhalt eines DirectoryIterator unter Verwendung Ihrer isImage Funktion durch Erweiterung der abstrakten FilterIterator Klasse zu filtern.

class ImageIterator extends FilterIterator { 

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

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

Sie könnten dann iterator_count (oder implementieren die Countable Schnittstelle und verwenden Sie die native count-Funktion) die Anzahl der Bilder zu bestimmen. Zum Beispiel:

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

Mit diesem Ansatz, je nachdem, wie Sie brauchen diesen Code zu verwenden, könnte es sinnvoll, die isImage Funktion in die ImageIterator Klasse zu bewegen, alles zu haben ordentlich an einem Ort eingewickelt.

3

Der zuvor erwähnte Code

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

ist die beste beste, aber die {jpg, png, gif} Bit funktioniert nur, wenn Sie die GLOB_BRACE Flagge am Ende anfügen:

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

i tun es wie folgt aus:

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

aber es zählt auch das. und ..

+0

Es ruft auch Ordner ab, so weit ich weiß, sollten Sie das '$ files' Array durchlaufen und prüfen, ob es eine Datei ist, die' is_file' verwendet. – Brian

0

Ich benutze dies, um eine Zählung aller Dateien in einem Verzeichnis außer. zurückzugeben. und ..

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

Hier ist a good list of glob filters für Dateiabgleichzwecke.

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

if ($nfiles !== FALSE){ 

    return count($nfiles); 

} else { 

    return 0; 

} 
1

Ich verwende den folgenden die Zählung für alle Arten von Dateien in einem Verzeichnis in Laravel

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

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