13

PHPでイテレータをソートする簡単な方法はありますか(すべてを配列に取り込んでソートするだけではありません)。

私が持っている特定の例はDirectoryIteratorですが、どのイテレーターにも一般的なソリューションがあると便利です。

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

これらをさまざまな基準 (ファイル名、サイズなど) で並べ替えられるようにしたいと考えています。

4

3 に答える 3

6

それを行う方法はありません。イテレータは、リストを「反復」する必要があります。必要な動作を実現するには、基になるリストを並べ替える必要があります。

ちなみに、SPL のより完全なリファレンスはこちらです: http://www.php.net/~helly/php/ext/spl/

于 2008-10-30T18:57:24.037 に答える
6

5年後にここにたどり着く人のために:

Iterator を ArrayIterator の拡張にする場合は、使用できます

ArrayIterator::uasort (値でソート) および ArrayIterator::uksort (キーでソート)

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

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

于 2014-11-10T13:36:14.143 に答える
6

iterator_to_array() の次に uasort() を使用して削減する必要があります。そして、私のパフォーマンス テストでは、十分に高速です。

あなたの特定の例では、イテレータを使用して私が知っている最もコンパクトな方法は次のとおりです。

// 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());'));
于 2010-09-30T15:55:32.117 に答える