Escanear directorios recursivamente

En el artículo anterior hablé de los iteradores que aporta PHP para acceder al sistema de archivos y puse una función para eliminar directorios de manera recursiva.

Ahora pondré una función que devuelve todos los archivos y directorios de un directorio de manera recursiva. También se puede filtrar el resultado para devolver solamente los directorios o los archivos.

  1.     /**
  2.      * Devuelve todos los archivos y directorios existentes en el directorio especificado.
  3.      * Se eliminan los directorios . y .. del resultado.
  4.      * Si se especifica $mode no se incluyen archivos especiales como sockets o enlaces.
  5.      *
  6.      * @param string $dir Directorio donde iniciar la búsqueda.
  7.      * @param bool   $mode Filtrar el resultado por archivos o directorios.
  8.      *                     T_DIR para devolver solamente los directorios,
  9.      *                     T_FILE para devolver solamente los archivos y
  10.      *                     FALSE para devolver todo.
  11.      *
  12.      * @return array
  13.      */
  14.     public static function scandir($dir, $mode = FALSE)
  15.     {
  16.         /**
  17.          * @var $_file \SplFileInfo
  18.          */
  19.         $_files = [];
  20.         $_iterator = new \RecursiveIteratorIterator(
  21.             new \RecursiveDirectoryIterator(
  22.                 $dir,
  23.                 \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::UNIX_PATHS
  24.             ),
  25.             \RecursiveIteratorIterator::SELF_FIRST
  26.         );
  27.         foreach ($_iterator as $_file)
  28.         {
  29.             if (!$mode || ($mode === T_DIR && $_file->isDir()) || ($mode === T_FILE && $_file->isFile()))
  30.             {
  31.                 $_files[] = $_file->getPathname();
  32.             }
  33.         }
  34.         sort($_files);
  35.  
  36.         return $_files;
  37.     }