12

ディレクトリ内の画像の数を見つけて変数に出力するためのより良い/簡単な方法はありますか?

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

これを行うには長い道のりのように思えますが、もっと簡単な方法はありませんか?

注: isImage() 関数は、ファイルが画像の場合に true を返します。

4

10 に答える 10

25

DirectoryIterator の標準 PHP ライブラリ (別名 SPL) を確認してください。

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

(参考までに、 iterator_count() と呼ばれる文書化されていない関数がありますが、おそらく今のところそれに依存しないのが最善だと思います。とにかく、 . や .. などの目に見えないものを除外する必要があります。)

于 2008-10-22T03:55:38.050 に答える
15

これにより、ディレクトリにあるもののカウントが得られます。画像だけを数える部分はあなたにお任せします。

iterator_count(new DirectoryIterator('path/to/dir/'));
于 2008-10-22T04:40:54.340 に答える
5

私はこのようにします:

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

もカウントします。と ..

于 2013-01-28T17:12:17.603 に答える
4

前述のコード

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

が最善ですが、{jpg,png,gif} ビットはGLOB_BRACE、最後にフラグを追加した場合にのみ機能します。

$count = count(glob("*.{jpg,png,gif,bmp}", GLOB_BRACE));
于 2010-10-11T11:03:51.093 に答える
3

あなたが使用することができますglob...

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

または、これがあなたのニーズにどれだけ適しているかわかりませんが、これを行うことができます:

$count = count(glob("*.{jpg,png,gif,bmp}"));
于 2008-10-22T04:45:50.507 に答える
1

また、SPL を使用して、抽象クラスを拡張することによりDirectoryIterator、関数を使用してa のコンテンツをフィルター処理することもできます。isImageFilterIterator

class ImageIterator extends FilterIterator {

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

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

次に、使用iterator_count(またはCountableインターフェイスを実装してネイティブcount関数を使用) して、画像の数を決定できます。例えば:

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

このアプローチを使用すると、このコードをどのように使用する必要があるかに応じて、isImage関数をImageIteratorクラスに移動して、すべてを 1 か所にきちんとまとめた方が理にかなっている場合があります。

于 2009-05-31T11:21:23.617 に答える
0
$nfiles = glob("/path/to/file/[!\\.]*");

if ($nfiles !== FALSE){

    return count($nfiles);

} else {

    return 0;

}
于 2013-06-02T09:42:13.507 に答える
0

あなたの答えは、あなたが得ることができるのと同じくらい簡単に思えます。PHPでもPerlでも、これよりも短い方法は考えられません。

Linux を使用している場合は、isImage() の複雑さに応じて、ls、wc、および grep を含む system / exec コマンドを実行できる場合があります。

とにかく、あなたが持っているもので十分だと思います。関数を 1 回だけ記述する必要があります。

于 2008-10-22T04:09:33.357 に答える