2009-09-06 11 views
8

Estoy haciendo un directorio que liste PHP5 script para lighttpd. En un directorio determinado, me gustaría poder enumerar subdirectorios y archivos directos (con información).Ordenando archivos con DirectoryIterator

Después de una búsqueda rápida, DirectoryIterator parece ser mi amigo:

foreach (new DirectoryIterator('.') as $file) 
{ 
    echo $file->getFilename() . '<br />'; 
} 

pero me gustaría ser capaz de ordenar los archivos por nombre de archivo, fecha, tipo MIME ... etc

¿Cómo hacer esto (con ArrayObject/ArrayIterator?)?

Gracias

+1

pregunta excelente, justo lo que estaba buscando. –

Respuesta

2

Philipp W. registraron un buen ejemplo aquí: http://php.oregonstate.edu/manual/en/directoryiterator.isfile.php

function cmpSPLFileInfo($splFileInfo1, $splFileInfo2) 
{ 
    return strcmp($splFileInfo1->getFileName(), $splFileInfo2->getFileName()); 
} 

class DirList extends RecursiveDirectoryIterator 
{ 
    private $dirArray; 

    public function __construct($p) 
    { 
     parent::__construct($p); 
     $this->dirArray = new ArrayObject(); 
     foreach($this as $item) 
     { 
      $this->dirArray->append($item); 
     } 
     $this->dirArray->uasort("cmpSPLFileInfo"); 
    } 

    public function getIterator() 
    { 
     return $this->dirArray->getIterator(); 
    } 

} 
+1

El problema que estoy encontrando con esto es que parece ordenar todo correctamente, pero las claves numéricas siguen siendo las mismas. Esto parece hacer que un foreach itere en el orden original, aunque print_r imprime todo en el orden correcto. – enobrev

+0

* foreach * siempre sigue el orden de la matriz, no ordena por teclas numéricas. – AndreKR

+0

cambie el código anterior de ** uasort() ** a ** usort() ** para restablecer las claves. – ryanwinchester

4

encima solución no funcionó para mí. Esto es lo que sugiero:

class SortableDirectoryIterator implements IteratorAggregate 
{ 

    private $_storage; 

    public function __construct($path) 
    { 
    $this->_storage = new ArrayObject(); 

    $files = new DirectoryIterator($path); 
    foreach ($files as $file) { 
     $this->_storage->offsetSet($file->getFilename(), $file->getFileInfo()); 
    } 
    $this->_storage->uksort(
     function ($a, $b) { 
      return strcmp($a, $b); 
     } 
    ); 
    } 

    public function getIterator() 
    { 
    return $this->_storage->getIterator(); 
    } 

}