【问题标题】:Sorting PHP Iterators对 PHP 迭代器进行排序
【发布时间】:2008-10-30 18:42:21
【问题描述】:

有没有一种简单的方法可以在 PHP 中对迭代器进行排序(而不是将其全部放入数组中并对其进行排序)。

我的具体示例是DirectoryIterator,但如果有一个适用于任何迭代器的解决方案,那就太好了。

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

我希望能够按各种标准(文件名、大小等)对它们进行排序

【问题讨论】:

    标签: php iterator


    【解决方案1】:

    没有办法做到这一点。迭代器应该“迭代”整个列表。您必须对基础列表进行排序以实现所需的行为。

    顺便说一句,对 SPL 的更完整参考在这里: http://www.php.net/~helly/php/ext/spl/

    【讨论】:

      【解决方案2】:

      你必须使用 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());'));
      

      【讨论】:

        【解决方案3】:

        对于那些在 5 年后结束的人:

        如果你将 Iterator 作为 ArrayIterator 的扩展,你可以使用

        ArrayIterator::uasort(按值排序)和 ArrayIterator::uksort(按键排序)

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-15
          • 2016-08-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多