Сортировка файлов с помощью DirectoryIterator

Я делаю каталог, содержащий скрипт PHP5 для lighttpd. В данном каталоге я хотел бы иметь возможность перечислять прямые подкаталоги и файлы (с информацией).

После быстрого поиска DirectoryIterator кажется мне моим другом:

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

но я хотел бы иметь возможность сортировать файлы по имени файла, дате, типу mime ... и т. д.

Как это сделать (с помощью ArrayObject / ArrayIterator?)?

Спасибо


person abernier    schedule 06.09.2009    source источник
comment
отличный вопрос, именно то, что я искал.   -  person Peter Perháč    schedule 19.06.2010


Ответы (2)


Вышеупомянутое решение не сработало для меня. Вот что я предлагаю:

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();
    }

}
person Sergey    schedule 04.07.2011

Филипп В. разместил здесь хороший пример: 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();
    }

}
person KiNgMaR    schedule 06.09.2009
comment
Проблема, с которой я сталкиваюсь, заключается в том, что он, кажется, все правильно сортирует, но числовые ключи остаются прежними. Похоже, что это заставляет итерацию foreach выполнять итерацию в исходном порядке, хотя print_r печатает все в правильном порядке. - person enobrev; 04.10.2011
comment
foreach всегда следует порядку в массиве, он не сортирует по числовым ключам. - person AndreKR; 22.09.2012
comment
измените приведенный выше код с uasort () на usort (), чтобы сбросить ключи. - person ryanwinchester; 26.03.2013
comment
Вы не можете использовать usort для ArrayObject (php.net/manual/en/class.arrayobject .php) - person Frug; 07.10.2013