Sfat rapid buclă prin foldere cu globul PHP ()

Folosești încă opendir () pentru a rula prin foldere în PHP? Nu necesită mult cod repetitiv de fiecare dată când doriți să căutați un dosar? Din fericire, globul PHP () este o soluție mult mai inteligentă.


Introducere

Iată un exemplu de reluare a unor informații dintr-un dosar, utilizând funcția tradițională opendir ().

 $ dir = "/ etc / php5 /"; // deschideți un director cunoscut și continuați să citiți conținutul acestuia dacă (is_dir ($ dir)) if ($ dh = opendir ($ dir)) în timp ce ($ file = readdir ($ dh) ) echo "nume fișier: $ file: filetype:". filetype (fișier $ dir. $). "\ N";  closedir ($ dh);  

Ar trebui să pară ceva familiar. Putem scurta masiv codul de mai sus cu:

 $ dir = "/ etc / php5 / *"; // Deschideți un director cunoscut și continuați să citiți conținutul lui foreach (glob ($ dir) ca fișier $) echo "filename: $ file: filetype:". filetype (fișier $). "
";

Nu este mult mai ușor? Doriți să aflați cum funcționează metoda? Dacă da, atunci hai să mergem mai departe.

glob () suportă un total de două argumente, al doilea argument fiind opțional. Primul argument este calea spre dosar, dar este un pic mai puternic decât asta.


Pasul 1. Primul argument

Acest prim argument susține un model. Aceasta înseamnă că puteți limita căutarea la anumite tipuri de fișiere sau chiar mai multe directoare simultan, utilizând mai multe asterixuri "*". Să presupunem că aveți un site web care permite utilizatorilor să încarce imagini (doar pentru că am citit acest lucru). Fiecare utilizator are folderul propriu în dosarul "userImages". În interiorul acestui dosar există două foldere suplimentare, denumite "HD" și "TN", pentru imagini de înaltă definiție (de dimensiuni medii) și pentru miniaturi. Să ne imaginăm că doriți să faceți buclă prin toate folderele "TN" ale utilizatorilor dvs. și să imprimați numele de fișiere. Acest lucru ar necesita un fragment de cod relativ mare dacă ați fi folosit open_dir (); cu glob (), este ușor.

 foreach (glob ('userImages / * / TN / *') ca $ image) echo "Numele fișierului:". $ imagine. "
";

Aceasta va căuta userImages / any / TN / any și va returna o listă a fișierelor care se potrivesc cu modelul.

 Nume fișier: userImages / username1 / TN / test.jpg Numele fișierului: userImages / username1 / TN / test3.jpg Nume fișier: userImages / username1 / TN / test2.jpg Nume fisier: userImages / username2 / TN / test4.gif Nume fisier: userImages / username3 / TN / styles.css 

Putem chiar să facem lucrurile un pas mai departe și să fim mai specifici prin includerea unui format de fișier în declarația noastră de bază:

 foreach (glob ('userImages / * / TN / *. jpg') ca $ image) echo "Numele fișierului:". $ imagine. "
";

Acum, asta va reveni doar pe Jpegs.

 Nume fișier: userImages / username1 / TN / test.jpg Nume fișier: userImages / username1 / TN / test3.jpg Nume fișier: userImages / username2 / TN / test2.jpg 

Ea devine și mai bună. Dacă, de exemplu, aveți nevoie de Jpegs, dar și de Gifuri; nimic altceva? Sau dacă doriți să imprimați numai numele de foldere? Aici intră în joc al doilea argument.


Etapa 2. Al doilea argument

Al doilea argument este, așa cum am menționat anterior, opțional. Cu toate acestea, acesta oferă un set foarte frumos de steaguri opționale. Acestea vă vor permite să schimbați comportamentul globului ().

  • GLOB_MARK: Adaugă o slash la fiecare director returnat
  • GLOB_NOSORT: Returnează fișierele așa cum apar în director (fără sortare)
  • GLOB_NOCHECK: Returnați modelul de căutare dacă nu s-au găsit fișiere care să corespundă acestuia
  • GLOB_NOESCAPE: Backslash-urile nu citează metacaracterele
  • GLOB_BRACE: Extinde a, b, c pentru a se potrivi cu "a", "b" sau "c"
  • GLOB_ONLYDIR: Returnează numai intrările de agende care se potrivesc cu modelul
  • GLOB_ERR: Stop la erorile de citire (cum ar fi directoarele care nu pot fi citite), erorile implicite sunt ignorate

După cum vedeți, cerințele potențiale pe care le-am notat la sfârșitul pasului 1 pot fi ușor rezolvate cu GLOB_BRACE:

 foreword (glob ('userImages / * / TN / *. jpg, *. gif', GLOB_BRACE) ca $ image) echo "Nume fișier:". $ imagine. "
";

care va returna acest lucru:

 Nume fișier: userImages / username1 / TN / test.jpg Nume fișier: userImages / username1 / TN / test4.jpg Nume fișier: userImages / username2 / TN / test2.jpg 

Dacă dorim să tipărim numai nume de subfolder, am putea folosi GLOB_ONLYDIR:

 foreach (glob ('userImages / * / TN / *', GLOB_ONLYDIR) ca $ image) echo "Numele fișierului:". $ imagine. "
";

care va imprima:

 Nume fișier: userImages / username2 / TN / subfolder 

Concluzie și un exemplu suplimentar

Această metodă a fost disponibilă încă din PHP 4.3, însă nu este folosită foarte des, ciudat. Nu am învățat până nu mă întârzii. Acum, folosesc adesea glob () când încărc pluginurile în cadrul meu:

 foreach (glob ('include / plugins / *. php') ca $ plugin) include_once ($ plugin);  

Asta e tot; Sper că v-ați bucurat de acest sfat rapid și spuneți-mi dacă aveți întrebări!

Cod