Frage

Gibt es eine bessere/einfachere Möglichkeit zu finden, die Anzahl von Bildern in einem Verzeichnis und die Ausgabe in eine variable?

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

Dies scheint wie ein langer Weg, dies zu tun, gibt es keinen einfacheren Weg?

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

War es hilfreich?

Lösung

Ü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 iterator_count genannt (), aber wahrscheinlich am besten nicht für jetzt darauf verlassen Ich kann mir vorstellen würde. Und Sie müssten wie unsichtbare Sachen auszufiltern. Und .. sowieso.)

Andere Tipps

Dies gibt Ihnen die Zählung von dem, was in Ihrem dir ist. Ich werde den Teil verlassen etwa nur Bilder auf Sie zählen, wie ich bin fallll aaasssllleeelppppppzzzzzzzzzzzzz.

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

Ich mache es wie folgt aus:

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

aber es zählt auch die. und ..

Der oben genannte 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));

Sie könnten glob verwenden ...

$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 könnte dies tun:

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

Sie könnten auch den SPL machen den Inhalt eines DirectoryIterator mit Ihrer isImage Funktion zu filtern, indem die abstrakte FilterIterator Klasse erweitert.

class ImageIterator extends FilterIterator {

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

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

Sie könnten dann verwenden iterator_count (oder die Countable-Schnittstelle implementieren 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 diesen Code verwenden müssen, könnte es mehr Sinn zu bewegen, um die isImage Funktion in die ImageIterator Klasse hat alles fein säuberlich verpackt in einem Ort.

machen

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

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

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

Ihre Antwort scheint etwa so einfach, wie Sie es bekommen können.Ich kann nicht denken Sie an eine kürzere Weg, um es entweder in PHP oder Perl.

Sie könnten in der Lage sein, zu einem system / exec Befehl, mit ls, wc und grep, wenn Sie mit Linux arbeiten, je nachdem wie Komplex isImage() ist.

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

Ich benutze diese außer eine Zählung aller Dateien in einem Verzeichnis zurückzukehren. und ..

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

Hier ist eine gute Liste der glob Filter für Dateiabgleichzwecke .

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

if ($nfiles !== FALSE){

    return count($nfiles);

} else {

    return 0;

}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top