Pregunta

¿Existe una forma mejor / más sencilla de encontrar el número de imágenes en un directorio y generarlas en una variable?

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

Esto parece ser una forma tan larga de hacer esto, ¿no hay una manera más sencilla?

Nota: La función isImage () devuelve true si el archivo es una imagen.

¿Fue útil?

Solución

Consulte la Biblioteca estándar de PHP (también conocida como SPL) para DirectoryIterator:

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

(Para su información, hay una función no documentada llamada iterator_count (), pero probablemente lo mejor sea que no confíe en ella por ahora, me imagino. Y tendría que filtrar cosas invisibles como. Y ... de todos modos.)

Otros consejos

Esto te dará la cuenta de lo que está en tu directorio. Te dejo la parte sobre contar solo las imágenes ya que estoy a punto de caer aaasssllleeelppppppzzzzzzzzzzzz.

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

Lo hago así:

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

pero también cuenta el. y ..

El código antes mencionado

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

es tu mejor opción, pero el bit {jpg, png, gif} solo funcionará si agregas la marca GLOB_BRACE al final:

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

puedes usar glob ...

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

o, no estoy seguro de qué tan bien se adapte a sus necesidades, pero podría hacer esto:

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

También puede hacer uso de la SPL para filtrar el contenido de un DirectoryIterator utilizando su función isImage al extender la clase abstracta FilterIterator .

class ImageIterator extends FilterIterator {

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

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

Luego puede usar iterator_count (o implementar la interfaz Countable y usar la función nativa count ) para determinar el número de imágenes. Por ejemplo:

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

Usando este enfoque, dependiendo de cómo necesite usar este código, podría tener más sentido mover la función isImage a la clase ImageIterator para tener todo perfectamente envuelto en un solo lugar.

Uso lo siguiente para obtener el recuento de todos los tipos de archivos en un directorio en Laravel

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

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

Su respuesta parece tan simple como puede obtenerla. No puedo pensar en un camino más corto ni en PHP ni en Perl.

Es posible que pueda usar un comando system / exec que incluya ls, wc y grep si está usando Linux, dependiendo de lo complejo que sea la Imagen ().

En cualquier caso, creo que lo que tienes es suficiente. Solo tienes que escribir la función una vez.

Utilizo esto para devolver un recuento de TODOS los archivos en un directorio excepto. y ..

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

Aquí hay una buena lista de filtros globales para propósitos de comparación de archivos.

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

if ($nfiles !== FALSE){

    return count($nfiles);

} else {

    return 0;

}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top