Pergunta

Existe uma maneira simples para ordenar um iterador em PHP (sem justa puxar tudo em uma matriz e de classificação que).

O exemplo específico que eu tenho é um DirectoryIterator mas seria bom ter uma solução geral para qualquer iterator.

$dir = new DirectoryIterator('.');
foreach ($dir as $file)
    echo $file->getFilename();

Eu gostaria de ser capaz de resolver estes por vários critérios (nome, tamanho, etc)

Foi útil?

Solução

Não há nenhuma maneira de fazer isso. Um iterador deve "iterate" através da lista. Você tem que ordenar a lista subjacente para alcançar o comportamento necessário.

A propósito, a referência mais completa para o SPL é aqui: http://www.php.net/~helly/php/ext/spl/

Outras dicas

Para os que acabam aqui 5 anos depois:

Se você fizer o Iterator uma extensão do ArrayIterator você pode usar

ArrayIterator :: uasort (para ordenar por valor) e ArrayIterator :: uksort (para ordenar por chave)

http://php.net/manual/en/arrayiterator.uasort.php

http://php.net/manual/en/arrayiterator.uksort.php

Você vai ter que reduzir usando iterator_to_array (), em seguida, uasort (). E, no meu teste de desempenho, suficientemente rápido.

Para o seu exemplo específico, a maneira mais compacta que eu conheço usando iteradores está abaixo:

// get (recursively) files matching a pattern, each file as SplFileInfo object
$matches = new RegexIterator(
               new RecursiveIteratorIterator(
                   new RecursiveDirectoryIterator('/path/to/files/')
               ),
               '/(\.php|\.ini|\.xml)$/i'
            );
 $files = iterator_to_array($matches);

// sort them by name
uasort($files, create_function('$a,$b', 'return strnatcasecmp($a->getFilename(), $b->getFilename());'));
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top