PHPを使用してフォルダー内のファイルの総数を返す
質問
ディレクトリ内の画像の数を見つけて変数に出力するより良い/簡単な方法はありますか?
function dirCount($dir) {
$x = 0;
while (($file = readdir($dir)) !== false) {
if (isImage($file)) {$x = $x + 1}
}
return $x;
}
これはこれを行うには非常に長い方法のように思えますが、もっと簡単な方法はありませんか?
注: isImage()関数は、ファイルが画像の場合にtrueを返します。
解決
DirectoryIteratorの標準PHPライブラリ(別名SPL)を確認してください:
$dir = new DirectoryIterator('/path/to/dir');
foreach($dir as $file ){
$x += (isImage($file)) ? 1 : 0;
}
(FYI iterator_count()と呼ばれる文書化されていない関数がありますが、現時点ではこれに依存しないことが最善でしょう。想像してみてください。
他のヒント
これにより、ディレクトリにあるものの数がわかります。 aaasssllleeelppppppzzzzzzzzzzzzzに落ちようとしているので、画像のみをカウントする部分についてはお任せします。
iterator_count(new DirectoryIterator('path/to/dir/'));
iこのようにします:
$files = scandir($dir);
$x = count($files);
echo $x;
しかし、それもカウントします。そして..
前述のコード
$count = count(glob("*.{jpg,png,gif,bmp}"));
が最善ですが、{jpg、png、gif}ビットは、最後に GLOB_BRACE
フラグを追加した場合にのみ機能します:
$count = count(glob("*.{jpg,png,gif,bmp}", GLOB_BRACE));
glob
を使用できます...
$count = 0;
foreach (glob("*.*") as $file) {
if (isImage($file)) ++$count;
}
または、これがどれだけあなたのニーズに合うかはわかりませんが、これを行うことができます:
$count = count(glob("*.{jpg,png,gif,bmp}"));
また、SPLを使用して、 isImage
関数を使用して、抽象 FilterIterator
クラスを拡張することにより、 DirectoryIterator
のコンテンツをフィルタリングできます。
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つの場所にまとめます。
次を使用して、Laravelの1つのディレクトリにあるすべての種類のファイルの数を取得します
$dir = public_path('img/');
$files = glob($dir . '*.*');
if ( $files !== false )
{
$total_count = count( $files );
return $totalCount;
}
else
{
return 0;
}
あなたの答えは、あなたが手に入れることができるほど簡単なようです。 PHPまたはPerlのいずれかで、これより短い方法を考えることはできません。
isImage()の複雑さに応じてLinuxを使用している場合、ls、wc、およびgrepを含むsystem / execコマンドを実行できる場合があります。
とにかく、あなたが持っているもので十分だと思います。関数を一度書くだけです。
これを使用して、ディレクトリを除くすべてのファイルの数を返します。そして..
return count(glob("/path/to/file/[!\.]*"));
ファイルマッチングのための適切なglobフィルターのリストです。
$nfiles = glob("/path/to/file/[!\\.]*");
if ($nfiles !== FALSE){
return count($nfiles);
} else {
return 0;
}