PhpPosto che la variabile $dir contenga la path della cartella da cui vogliamo estrarre il file (deve essere quindi modificata appositamente e la cartella dovrà essere leggibile), la variabile $file conterrà il nome del file estratto casualmente.

<?php

$dir = '/path/to/directory';

if ($handle = opendir($dir)) {
   while (false !== ($filetmp = readdir($handle))) {
      if ($filetmp != "." && $filetmp != "..")
         $files[]=$filetmp;
   }
   closedir($handle);
   $file = $files[rand(0, count($files)-1)];
}

?>

Se si desidera che il nome del file sia comprensivo della path in cui si trova, è sufficiente anteporre la variabile $dir e uno slash alla variabile $file. Nel caso appena visto, la riga #11 diverrebbe quindi così:

$file = $dir.'/'.$files[rand(0, count($files)-1)];

oppure, più semplicemente, è possibile modificare il valore della variabile $file subito dopo la riga #11:

$file = $dir.'/'.$file;

Commentiamo (molto velocemente) il codice sopra presentato:

  • alla riga #5 apriamo la directory per leggerne il contenuto. L’if permette di procedere solo se non si verificano errori nella lettura della directory;
  • alla riga #6, tramite un ciclo while, cicliamo il contenuto della directory;
  • alle righe #7 e #8 creiamo un array $files contenente gli elementi contenuti dalla directory1. L’if alla riga #7 fa in modo che siano considerati solo gli elementi “reali” contenuti della directory, escludendo quindi i link alle directory superiori2.
    A questo punto, ad ogni elemento dell’array $files corrisponde un elemento della directory, ordinati con indice a partire da 0 (zero)3. Quindi per “estrarre” casualmente un elemento della directory sarà sufficiente indicare un indice casuale per l’array $files4.
  • alla riga #10 chiudiamo la directory;
  • alla riga #11 assegniamo (come spiegato due punti più su) alla variabile $file l’elemento dell’array $files che ha come indice un numero estratto casualmente (tramite la funzione rand), compreso tra zero (perché – come già spiegato – il primo elemento ha indice zero) e il numero degli elementi contenuti nell’array (restituito dalla funzione count) meno uno (n-1)5.

Questo script può avere numerosissime applicazioni. Due esempi che mi vengono subito in mente:

  1. includere un file casuale (magari nella directory da cui andiamo ad estrarre sono contenuti dei file .txt, ognuno dei quali contiene una citazione, e quindi vogliamo mostrare una citazione casuale), tramite Php:
    include $file;
  2. mostrare un’immagine casuale (magari per avere un header del sito che cambi ad ogni refresh della pagina), tramite (x)Html e Php:
    <img src="<?php print($file); ?>" />

Badate bene: lo script estrae casualmente un file tra tutti quelli inclusi nella directory indicata, indiscriminatamente. Quindi, oltre a preoccuparsi che la directory sia leggibile, sarà necessario anche assicurarsi che la directory in questione contenga veramente solo i file da includere nell’estrazione.

1 In altri termini, il contenuto della directory verrà “riversato” in un array, in modo da poter essere “manipolato” con maggiore facilità.
2 Se in un terminale date il comando ls -a, vedrete che in ogni directory esiste un elemento punto e un elemento due punti consecutivi.
3 Ciò sta a significare che $files[0] è il primo elemento della directory, $files[1] il secondo elemento e così via, fino a $files[n-1], dove n è il numero di elementi contenuti nell’array $files.
4 Ovvero l’elemento della directory casuale sarà $files[x], dove x è un numero casuale
5Se il primo elemento dell’array ha indice 0, allora l’ultimo elemento avrà indice n-1.

Espandi/comprimi Commenti

[…] precedente post ho spiegato (anche approfonditamente) come sia possibile “estrarre” un file casuale tramite Php, proponendo anche un esempio riguardante proprio un’immagine. Vediamo ora come modificare […]

XHTML - Puoi usare questi tag: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>