vendor/symfony/finder/Iterator/SortableIterator.php line 84

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the Symfony package.
  4.  *
  5.  * (c) Fabien Potencier <fabien@symfony.com>
  6.  *
  7.  * For the full copyright and license information, please view the LICENSE
  8.  * file that was distributed with this source code.
  9.  */
  10. namespace Symfony\Component\Finder\Iterator;
  11. /**
  12.  * SortableIterator applies a sort on a given Iterator.
  13.  *
  14.  * @author Fabien Potencier <fabien@symfony.com>
  15.  */
  16. class SortableIterator implements \IteratorAggregate
  17. {
  18.     public const SORT_BY_NONE 0;
  19.     public const SORT_BY_NAME 1;
  20.     public const SORT_BY_TYPE 2;
  21.     public const SORT_BY_ACCESSED_TIME 3;
  22.     public const SORT_BY_CHANGED_TIME 4;
  23.     public const SORT_BY_MODIFIED_TIME 5;
  24.     public const SORT_BY_NAME_NATURAL 6;
  25.     private $iterator;
  26.     private $sort;
  27.     /**
  28.      * @param int|callable $sort The sort type (SORT_BY_NAME, SORT_BY_TYPE, or a PHP callback)
  29.      *
  30.      * @throws \InvalidArgumentException
  31.      */
  32.     public function __construct(\Traversable $iterator$sortbool $reverseOrder false)
  33.     {
  34.         $this->iterator $iterator;
  35.         $order $reverseOrder ? -1;
  36.         if (self::SORT_BY_NAME === $sort) {
  37.             $this->sort = static function (\SplFileInfo $a\SplFileInfo $b) use ($order) {
  38.                 return $order strcmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname());
  39.             };
  40.         } elseif (self::SORT_BY_NAME_NATURAL === $sort) {
  41.             $this->sort = static function (\SplFileInfo $a\SplFileInfo $b) use ($order) {
  42.                 return $order strnatcmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname());
  43.             };
  44.         } elseif (self::SORT_BY_TYPE === $sort) {
  45.             $this->sort = static function (\SplFileInfo $a\SplFileInfo $b) use ($order) {
  46.                 if ($a->isDir() && $b->isFile()) {
  47.                     return -$order;
  48.                 } elseif ($a->isFile() && $b->isDir()) {
  49.                     return $order;
  50.                 }
  51.                 return $order strcmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname());
  52.             };
  53.         } elseif (self::SORT_BY_ACCESSED_TIME === $sort) {
  54.             $this->sort = static function (\SplFileInfo $a\SplFileInfo $b) use ($order) {
  55.                 return $order * ($a->getATime() - $b->getATime());
  56.             };
  57.         } elseif (self::SORT_BY_CHANGED_TIME === $sort) {
  58.             $this->sort = static function (\SplFileInfo $a\SplFileInfo $b) use ($order) {
  59.                 return $order * ($a->getCTime() - $b->getCTime());
  60.             };
  61.         } elseif (self::SORT_BY_MODIFIED_TIME === $sort) {
  62.             $this->sort = static function (\SplFileInfo $a\SplFileInfo $b) use ($order) {
  63.                 return $order * ($a->getMTime() - $b->getMTime());
  64.             };
  65.         } elseif (self::SORT_BY_NONE === $sort) {
  66.             $this->sort $order;
  67.         } elseif (\is_callable($sort)) {
  68.             $this->sort $reverseOrder ? static function (\SplFileInfo $a\SplFileInfo $b) use ($sort) { return -$sort($a$b); } : $sort;
  69.         } else {
  70.             throw new \InvalidArgumentException('The SortableIterator takes a PHP callable or a valid built-in sort algorithm as an argument.');
  71.         }
  72.     }
  73.     /**
  74.      * @return \Traversable
  75.      */
  76.     public function getIterator()
  77.     {
  78.         if (=== $this->sort) {
  79.             return $this->iterator;
  80.         }
  81.         $array iterator_to_array($this->iteratortrue);
  82.         if (-=== $this->sort) {
  83.             $array array_reverse($array);
  84.         } else {
  85.             uasort($array$this->sort);
  86.         }
  87.         return new \ArrayIterator($array);
  88.     }
  89. }