In questo articolo vedremo come ordinare i file in una directory con PHP.
La soluzione è la seguente:
function sort_files_in_dir($dir, $sort = 'asc') {
if(!is_dir($dir)) {
return false;
}
$dir = scandir($dir);
$files = array_map(array_diff($dir, ['.', '..']), function($file) {
return $dir . '/' . $file;
});
usort($files, function($a, $b) use ($sort) {
if($sort == 'asc') {
return filemtime($a) > filemtime($b);
} else {
return filemtime($a) < filemtime($b);
}
});
return $files;
}
La funzione effettua questi passaggi su una directory:
Controlla se la directory specificata (
$dir
) esiste utilizzando la funzioneis_dir()
. Se la directory non esiste, la funzione restituiscefalse
e termina l'esecuzione.Utilizza la funzione
scandir()
per ottenere un elenco dei file nella directory specificata. L'array restituito contiene anche i riferimenti ai directory "." e "..".Utilizza la funzione
array_diff()
in combinazione conarray_map()
per rimuovere i riferimenti alle directory correnti e precedenti ("." e "..") dall'elenco dei file. L'array risultante è memorizzato nella variabile$files
.Utilizza la funzione
usort()
per ordinare l'array$files
.usort()
richiede due argomenti: l'array da ordinare e una funzione di confronto personalizzata. Nel caso della funzionesort_files_in_dir
, la funzione di confronto personalizzata viene definita come una funzione anonima (lambda function) utilizzando la parola chiavefunction($a, $b)
.La funzione di confronto prende due file (
$a
e$b
) e confronta le loro date di modifica utilizzando la funzionefilemtime()
. Se il parametro$sort
è impostato su 'asc' (valore predefinito), la funzione restituiràtrue
se la data di modifica di$a
è maggiore di quella di$b
, altrimenti restituiràfalse
. Questo ordina gli elementi in modo crescente.Se il parametro
$sort
è diverso da 'asc', la funzione inverte l'operazione di confronto, restituendotrue
se la data di modifica di$a
è minore di quella di$b
, altrimenti restituiscefalse
. Questo ordina gli elementi in modo decrescente.Restituisce infine l'array di file ordinato.