Hurtig Tips Loop Through Mapper med PHP Glob ()

Bruker du fortsatt opendir () for å løse gjennom mapper i PHP? Krever det ikke mye repeterende kode hver gang du vil søke i en mappe? Heldigvis er PHPs glob () en mye smartere løsning.


Introduksjon

Her er et eksempel på å ekko ut noen informasjon fra en mappe, ved hjelp av den tradisjonelle opendir () -funksjonen.

 $ dir = "/ etc / php5 /"; // Åpne en kjent katalog, og fortsett å lese innholdet hvis (is_dir ($ dir)) if ($ dh = opendir ($ dir)) while (($ file = readdir ($ dh)) == false ) echo "filnavn: $ file: filetype:". filetype ($ dir. $ fil). "\ N";  closedir ($ dh);  

Det skal se litt kjent ut. Vi kan massivt forkorte koden ovenfor med:

 $ dir = "/ etc / php5 / *"; // Åpne en kjent katalog, og fortsett å lese innholdet foreach (glob ($ dir) som $ fil) echo "filnavn: $ file: filetype:". filetype ($ fil). "
";

Er det ikke så mye enklere? Har du lyst til å lære hvordan metoden fungerer? Hvis ja, så la oss fortsette med det.

glob () støtter totalt to argumenter, mens det andre argumentet er valgfritt. Det første argumentet er banen til mappen, men det er litt kraftigere enn det.


Trinn 1. Det første argumentet

Dette første argumentet støtter et mønster. Dette betyr at du kan begrense søket til bestemte filtyper eller til og med flere kataloger samtidig ved å bruke flere asterixer "*". La oss anta at du har et nettsted som lar brukerne laste opp bilder (bare fordi jeg leser dette). Hver bruker har sin egen mappe i mappen "userImages." Inne i denne mappen er to ekstra mapper, kalt "HD" og "TN", for bilder med høy oppløsning (full størrelse) og for miniatyrbilder. La oss forestille deg at du vil gå gjennom alle brukerne dine "TN" -mapper og skrive ut filnavnene. Dette ville kreve en relativt stor kodebit hvis du skulle bruke open_dir (); Men med glob () er det enkelt.

 foreach (glob ('userImages / * / TN / *') som $ image) echo "Filnavn:". $ bilde. "
";

Dette vil søke userImages / any / TN / any og vil returnere en liste over filene som samsvarer med mønsteret.

 Filnavn: userImages / username1 / TN / test.jpg Filnavn: userImages / username1 / TN / test3.jpg Filnavn: userImages / username1 / TN / test5.png Filnavn: userImages / username2 / TN / subfolder Filnavn: userImages / username2 / TN / test2.jpg Filnavn: userImages / username2 / TN / test4.gif Filnavn: userImages / username3 / TN / styles.css 

Vi kan til og med ta ting et skritt videre, og være mer spesifikk ved å inkludere et filformat i vår foreach-setning:

 foreach (glob ('userImages / * / TN / * .jpg') som $ image) echo "Filnavn:". $ bilde. "
";

Nå returnerer dette bare Jpeg.

 Filnavn: userImages / username1 / TN / test.jpg Filnavn: userImages / username1 / TN / test3.jpg Filnavn: userImages / username2 / TN / test2.jpg 

Det blir enda bedre. Hva om, for eksempel, trenger du Jpegs, men også Gifs; ingenting annet? Eller hva om du bare vil skrive ut mappens navn? Det er her det andre argumentet kommer inn i spill.


Trinn 2. Det andre argumentet

Det andre argumentet er, som tidligere nevnt, valgfritt. Det gir imidlertid et veldig fint sett med valgfrie flagg. Disse vil tillate deg å endre måten glob () oppfører seg på.

  • GLOB_MARK: Legger til et skråstrek til hver katalog som returneres
  • GLOB_NOSORT: Returner filer som de vises i katalogen (ingen sortering)
  • GLOB_NOCHECK: Returner søkemønsteret hvis det ikke ble funnet noen filer som samsvarer med det
  • GLOB_NOESCAPE: Backslashes citerer ikke meta tegn
  • GLOB_BRACE: Utvider a, b, c for å matche 'a', 'b' eller 'c'
  • GLOB_ONLYDIR: Return kun katalogoppføringer som samsvarer med mønsteret
  • GLOB_ERR: Stopp på lesefeil (som ulæselige kataloger), standardfeil ignoreres

Som du ser, kan de potensielle kravene som vi oppdaget på slutten av trinn 1 enkelt bli løst med GLOB_BRACE:

 foreach (glob ('userImages / * / TN / * .jpg, * .gif', GLOB_BRACE) som $ image) echo "Filnavn:". $ bilde. "
";

som vil returnere dette:

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

Hvis vi ønsker å bare skrive ut undermappe navn, kan vi bruke GLOB_ONLYDIR:

 foreach (glob ('userImages / * / TN / *', GLOB_ONLYDIR) som $ image) echo "Filnavn:". $ bilde. "
";

som vil skrive ut:

 Filnavn: userImages / brukernavn2 / TN / undermappe 

Konklusjon og ett mer eksempel

Denne metoden har vært tilgjengelig siden PHP 4.3, men den brukes ikke veldig ofte, merkelig. Jeg lærte det ikke før jeg var ganske sen selv. Nå bruker jeg ofte glob () når jeg legger til plugins i rammen min:

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

Det er alt; Jeg håper du likte dette raske tipset, og gi meg beskjed hvis du har noen spørsmål!