PHP kullanarak bir klasör içindeki dosyaların toplam sayısını döndürür

8 Cevap php

Bir değişkene bir dizin ve çıkış onları görüntülerin sayısını bulmak için daha iyi / basit bir yolu var mı?

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

Bu hiç kolay bir yolu yoktur, bunu yapmanın böyle uzun bir yol gibi görünüyor?

Dosya bir görüntü ise, Note: isImage () işlevi true döndürür.

8 Cevap

DirectoryIterator için Standart PHP Kütüphanesi (aka SPL) Çıkış:

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

(Bilginize Zaten orada (iterator_count adlı belgelenmemiş bir fonksiyondur) ama şimdi ona güvenmek için muhtemelen en iyi ben hayal ediyorum. Ve sizin gibi görünmeyen şeyler süzmek gerekiyordu. Ve ..).

Bu size dir ne olduğunu sayısını verecektir. Ben aaasssllleeelppppppzzzzzzzzzzzzz fallll üzereyim ben size sadece görüntüleri sayma hakkında kısmını bırakacağım.

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

Eğer kullanabilirsiniz glob ...

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

ya da, ben bu gereksinimlerinizi kadar iyi olduğundan emin değilim, ama bunu yapabilirsiniz:

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

Ben bunu şöyle yapın:

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

ama aynı zamanda sayar. ve ..

Yukarıda belirtilen kod

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

en iyi en iyi, ama ucunda GLOB_BRACE bayrağı append eğer {jpg, png, gif} bit sadece çalışacaktır:

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

Ayrıca soyut FilterIterator class uzatarak isImage işlevini kullanarak bir DirectoryIterator içeriğini filtre SPL faydalanmak olabilir.

class ImageIterator extends FilterIterator {

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

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

Daha sonra iterator_count kullanın (veya Countable arabirimini uygulayan ve yerli count işlevini kullanabilirsiniz) görüntü sayısını belirlemek için olabilir. Örneğin:

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

Bu yaklaşımı kullanarak, bu kodu kullanmanız gerekir nasıl bağlı, her şeyin düzgün bir yerde sarılmış olması ImageIterator sınıfa isImage işlevi taşımak daha mantıklı olabilir.

Cevabınız bunu elde edebilirsiniz yaklaşık olarak basit görünüyor. PHP veya Perl ya da bunun için bir kısa yol düşünemiyorum.

Eğer () ne kadar karmaşık isImage bağlı Linux kullanıyorsanız, ls, wc, ve grep içeren bir sistem / exec komutu mümkün olabilir.

Ne olursa olsun, ne var oldukça yeterli olduğunu düşünüyorum. Sen sadece bir kez fonksiyon yazmak zorunda.

Ben hariç bir dizinin TÜM dosyaların sayısını döndürmek için kullanabilirsiniz. ve ..

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

İşte a good list of glob filters dosyası eşleştirme amaçlıdır.