Suggerimento rapido scorrere le cartelle con PHP Glob ()

Stai ancora usando opendir () per scorrere le cartelle in PHP? Non richiede un sacco di codice ripetitivo ogni volta che vuoi cercare una cartella? Fortunatamente, glob () di PHP è una soluzione molto più intelligente.


introduzione

Ecco un esempio di come riecheggiare alcune informazioni da una cartella, usando la tradizionale funzione opendir ().

 $ dir = "/ etc / php5 /"; // Apre una directory conosciuta e procede a leggere il suo contenuto if (is_dir ($ dir)) if ($ dh = opendir ($ dir)) while (($ file = readdir ($ dh))! == false ) echo "nomefile: $ file: filetype:". filetype ($ dir. $ file). "\ N";  closedir ($ dh);  

Questo dovrebbe sembrare un po 'familiare. Possiamo abbreviare in modo massivo il codice di cui sopra con:

 $ dir = "/ etc / php5 / *"; // Apre una directory conosciuta e procede a leggere il suo contenuto foreach (glob ($ dir) come $ file) echo "nomefile: $ file: filetype:". filetype ($ file). "
";

Non è molto più facile? Desideroso di sapere come funziona il metodo? Se sì, allora andiamo avanti.

glob () supporta un totale di due argomenti, con il secondo argomento facoltativo. Il primo argomento è il percorso della cartella, tuttavia, è un po 'più potente di quello.


Passaggio 1. Il primo argomento

Questo primo argomento supporta un modello. Ciò significa che è possibile limitare la ricerca a specifici tipi di file o anche a più directory contemporaneamente utilizzando più asterischi "*". Supponiamo che tu abbia un sito Web che consente agli utenti di caricare immagini (solo perché ho letto questo). Ogni utente ha la propria cartella all'interno della cartella "userImages". All'interno di queste cartelle ci sono due cartelle aggiuntive, chiamate "HD" e "TN", per immagini ad alta definizione (a schermo intero) e per miniature. Immaginiamo di voler scorrere tutte le cartelle "TN" di tutti gli utenti e stampare i nomi dei file. Ciò richiederebbe uno snippet di codice relativamente grande se si usasse open_dir (); tuttavia, con glob (), è facile.

 foreach (glob ('userImages / * / TN / *') come $ image) echo "Nome file:". $ immagine. "
";

Questo cercherà userImages / any / TN / any e restituirà un elenco dei file che corrispondono al pattern.

 Nome file: userImages / username1 / TN / test.jpg Nome file: userImages / username1 / TN / test3.jpg Nome file: userImages / username1 / TN / test5.png Nome file: userImages / username2 / TN / sottocartella Nome file: userImages / username2 / TN / test2.jpg Nome file: userImages / username2 / TN / test4.gif Nome file: userImages / username3 / TN / styles.css 

Possiamo anche fare un passo avanti e essere più specifici includendo un formato di file nella nostra dichiarazione foreach:

 foreach (glob ('userImages / * / TN / *. jpg') come $ image) echo "Nome file:". $ immagine. "
";

Ora, questo restituirà solo Jpegs.

 Nome file: userImages / username1 / TN / test.jpg Nome file: userImages / username1 / TN / test3.jpg Nome file: userImages / username2 / TN / test2.jpg 

Diventa ancora meglio. Cosa succede se, ad esempio, hai bisogno di Jpegs, ma anche di Gifs; nient'altro? O se vuoi stampare solo i nomi delle cartelle? È qui che entra in gioco il secondo argomento.


Passaggio 2. Il secondo argomento

Il secondo argomento è, come accennato in precedenza, facoltativo. Tuttavia, fornisce un bel set di bandiere opzionali. Questi ti permetteranno di cambiare il modo in cui si comporta il tuo glob ().

  • GLOB_MARK: Aggiunge una barra a ciascuna directory restituita
  • GLOB_NOSORT: Restituisce i file così come appaiono nella directory (nessun ordinamento)
  • GLOB_NOCHECK: Restituisce il modello di ricerca se non sono stati trovati file corrispondenti
  • GLOB_NOESCAPE: Le barre rovesciate non citano i metacaratteri
  • GLOB_BRACE: Espande a, b, c in modo che corrisponda a 'a', 'b' o 'c'
  • GLOB_ONLYDIR: Restituisce solo le voci della directory che corrispondono al modello
  • GLOB_ERR: Interrompi gli errori di lettura (come le directory illeggibili), per impostazione predefinita gli errori vengono ignorati

Come puoi vedere, i potenziali requisiti che abbiamo notato alla fine del passaggio 1 possono essere facilmente risolti con GLOB_BRACE:

 foreach (glob ('userImages / * / TN / *. jpg, *. gif', GLOB_BRACE) come $ image) echo "Filename:". $ immagine. "
";

che restituirà questo:

 Nome file: userImages / username1 / TN / test.jpg Nome file: userImages / username1 / TN / test3.jpg Nome file: userImages / username2 / TN / test2.jpg Nome file: userImages / username2 / TN / test4.gif 

Se desideriamo stampare solo i nomi delle sottocartelle, potremmo utilizzare GLOB_ONLYDIR:

 foreach (glob ('userImages / * / TN / *', GLOB_ONLYDIR) come $ image) echo "Nome file:". $ immagine. "
";

che stamperà:

 Nome file: userImages / username2 / TN / sottocartella 

Conclusione e un altro esempio

Questo metodo è disponibile dal PHP 4.3, tuttavia, non è usato molto spesso, stranamente. Non l'ho imparato fino a tardi. Ora, uso glob () spesso durante il caricamento dei plugin nel mio framework:

 foreach (glob ('includes / plugins / *. php') come $ plugin) include_once ($ plugin);  

È tutto; Spero che questo suggerimento ti sia piaciuto e fammi sapere se hai qualche domanda!