> Manuales > Gestión de archivos en PHP

Cómo ordenar resultados en los listados de directorios, para que los archivos se muestren ordenados por fecha o nombre.

Ordenación en listados de directorios con PHP

PHP tiene diversas funciones útiles para hacer listados de ficheros, que vimos anteriormente en un artículo dedicado a Listar directorios y subdirectorios con PHP. Lo que ocurre es que una vez que recibes los archivos del directorio no tienes la posibilidad de especificar un orden en el que quieres que se entreguen con la función readdir(), tan solo te entregarán los ficheros, uno a uno, en el orden que juzgue oportuno tu sistema operativo.

Por lo tanto, si queremos ordenar los archivos resultantes de la lectura de directorio tendremos que crear nosotros mismos las funciones de ordenación. Esta es una tarea sencilla, pero que requiere algo de programación. Afortunadamente, las partes que requerirían más complejidad las podemos solucionar con las funciones de ordenación de arrays que el propio lenguaje PHP proporciona.

Para simplificar el proceso vamos a crear nuestra propia clase, de Programación Orientada a Objetos, con la que podemos listar los directorios en distintos órdenes, de modo que dejemos la complejidad del acceso al directorio y las ordenaciones encapsuladas en una clase.

Qué debes de saber para poder entender este código de acceso a directorios

Antes de pasar al código quiero dejar varios enlaces a artículos que podrían resultar de tu interés para entender cómo estamos haciendo las cosas en este taller.

Primero será necesario que sepas ordenar arrays por varios métodos de los que ofrece PHP. Nuestro orden se realizará especialmente sobre arrays asociativos. Podemos también saber más sobre arrays en PHP si no los conocemos con profundidad.

Posteriormente, debemos estar al tanto de los mecanismos para el acceso a los archivos que hay en un directorio. En este caso la lectura recomendada sería el mencionado artículo Listar directorios y subdirectorios con PHP, sin embargo, lo que tienes que tener claro es que al listar los archivos de un directorio lo que obtienes son los nombres de los archivos. Las rutas completas con las que tienes que enlazar esos archivos las tienes que componer a mano concatenando la ruta del directorio y el nombre de archivo.

Por último, ya que estamos trabajando con clases en PHP, es necesario que conozcas la sintaxis de objetos en PHP. Esto se ve en la segunda parte del Manual de PHP dedicada a los objetos.

Clase PHP de acceso a un directorio y listado con ordenación

Ahora que ya tienes toda la información necesaria, vamos a ver el código de la clase que hemos construido para resolver este problema.

class FileOrder {
  private $route;
  private $files = []; 

  public function __construct($route) {
    $this->route = $route;
    $directory = opendir($route);
    while (false !== ($file = readdir($directory))) {
      if (substr($file, 0, 1) != ".") {
        $fileRoute = $this->getFileRoute($file);
        $this->files[$fileRoute] = filectime($fileRoute);
      } 
    }
    closedir($directory);
  }

  private function getFileRoute($file) {
  return $this->route . '/' . $file;
  }

  // MÉTODOS DE ORDENACIÓN

  public function getDateOrderedAsc() {
    asort($this->files);
    return array_keys($this->files);
  }

  public function getDateOrderedDesc() {
    arsort($this->files);
    return array_keys($this->files);
  }

  public function getNameOrderedAsc() {
    ksort($this->files);
    return array_keys($this->files);
  }

  public function getNameOrderedDesc() {
    krsort($this->files);
    return array_keys($this->files);
  }
}

Voy rápidamente a entregar algunas claves para entender este código.

No hemos estimado que desde fuera de la clase se necesite acceder a las fechas de los archivos, pero si fuera necesario, lo único que habría que hacer es devolver el array completo, y no solamente el array de sus claves.

Cómo usar la clase de ordenación de listados de directorios

Ahora vamos a ver un código de ordenación del listado de un directorio con PHP. Este código es muy sencillo, ya que solamente hará uso de la clase anterior para todo el trabajo pesado.

Vamos inicialmente a especificar una ruta y luego inicializamos la clase con ella. Una vez que tengamos la clase invocaremos los distintos métodos de ordenación del listado del directorio que la clase nos proporciona.

$ruta = './fotos';
$fileOrder = new FileOrder($ruta);
echo "<p>Ordenado por fecha ASC";
foreach($fileOrder->getDateOrderedAsc() as $file) {
  showFile($file);
}
echo "<p>Ordenado por fecha DESC";
foreach ($fileOrder->getDateOrderedDesc() as $file) {
  showFile($file);
}
echo "<p>Ordenado por nombre ASC";
foreach ($fileOrder->getNameOrderedAsc() as $file) {
  showFile($file);
}
echo "<p>Ordenado por nombre DESC";
foreach ($fileOrder->getNameOrderedDesc() as $file) {
  showFile($file);
}

function showFile($file) {
  echo "
  <p>
    $file
    <br>
    <a href=\"$file\">
      <img src=\"$file\" width=\"200\" /></a>
  </p>
  ";
}

Una vez hemos encapsulado la complejidad de la ordenación de los ficheros en un objeto, el generar distintos listados con órdenes es así de simple: llamar al método de ordenación que necesitemos y recorrer el array que nos devuelve, mostrando cada uno de los archivos con el formato que se deba.

El formato de salida lo tenemos en una función showFile() que sería lo único que necesitarías adaptar si quieres cambiar el diseño y estructura de los resultados una vez se vuelquen al contenido HTML de tu página.

Es siempre bueno separar las vistas de la salida de tus programas PHP, para poder actualizar el contenido de la página cuando sea necesario. Para ello lo mejor es abstenerse de mezclar el código HTML y el código PHP siempre que se pueda.

Con esto hemos aprendido a realizar ordenación de arrays por criterios típicos como son la fecha o el nombre. Si tuvieras otras necesidades estamos seguros que podrías extender fácilmente la clase para proporcionar otros tipos de órdenes. Esa tarea ya te la dejamos para ti.

Miguel Angel Alvarez

Fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Com...

Manual