Snabbtips Gå igenom mappar med PHPs Glob ()

Användar du fortfarande opendir () för att gå igenom mappar i PHP? Det kräver inte mycket repeterande kod varje gång du vill söka i en mapp? Lyckligtvis är PHPs glob () en mycket smartare lösning.


Introduktion

Här är ett exempel på att echoing någon information från en mapp med den traditionella opendir () -funktionen.

 $ dir = "/ etc / php5 /"; // Öppna en känd katalog och fortsätt läsa innehållet om (is_dir ($ dir)) if ($ dh = opendir ($ dir)) while (($ file = readdir ($ dh)) == false ) echo "filnamn: $ file: filetype:". filtyp ($ dir. $ fil). "\ N";  closedir ($ dh);  

Det borde se lite bekant ut. Vi kan massivt förkorta koden ovan med:

 $ dir = "/ etc / php5 / *"; // Öppna en känd katalog och fortsätt att läsa innehållet föreach (glob ($ dir) som $ fil) echo "filnamn: $ file: filetype:". filtyp ($ fil). "
";

Är det inte så mycket lättare? Intressant att lära sig hur metoden fungerar? Om ja, låt oss fortsätta med det.

glob () stöder totalt två argument, med det andra argumentet valfritt. Det första argumentet är vägen till mappen, men det är lite kraftfullare än det.


Steg 1. Det första argumentet

Detta första argument stöder ett mönster. Det innebär att du kan begränsa sökningen till specifika filtyper eller till och med flera kataloger samtidigt genom att använda flera asterixer "*". Låt oss anta att du har en webbplats som tillåter användare att ladda upp bilder (bara för att jag läste detta). Varje användare har sin egen mapp i mappen "userImages." Inne i den här mappen finns två ytterligare mappar, kallad "HD" och "TN", för högupplösta bilder (i full storlek) och för miniatyrbilder. Låt oss föreställa oss att du vill gå igenom alla användarnas "TN" -mappar och skriva ut filnamnen. Detta skulle kräva ett relativt stort kodstycke om du skulle använda open_dir (); Men med glob () är det enkelt.

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

Detta kommer att söka userImages / any / TN / any och kommer att returnera en lista över de filer som matchar mönstret.

 Filnamn: userImages / username1 / TN / test.jpg Filnamn: userImages / username1 / TN / test3.jpg Filnamn: userImages / username1 / TN / test5.png Filnamn: userImages / username2 / TN / subfolder Filnamn: userImages / username2 / TN / test2.jpg Filnamn: userImages / username2 / TN / test4.gif Filnamn: userImages / användarnamn3 / TN / styles.css 

Vi kan till och med ta saker och ting ett steg längre och vara mer specifika genom att inkludera ett filformat i vårt uttalande:

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

Nu kommer det bara att returnera Jpegs.

 Filnamn: userImages / användarnamn1 / TN / test.jpg Filnamn: userImages / användarnamn1 / TN / test3.jpg Filnamn: userImages / username2 / TN / test2.jpg 

Det blir ännu bättre. Om du till exempel behöver Jpegs, men också Gifs; inget annat? Eller vad om du bara vill skriva ut mappnamn? Det är här det andra argumentet kommer in i spel.


Steg 2. Den andra argumenten

Det andra argumentet är, som tidigare nämnts, valfritt. Det ger dock en mycket fin uppsättning valfria flaggor. Dessa låter dig ändra hur din glob () beter sig.

  • GLOB_MARK: Lägger till en snedstreck till varje katalog som returneras
  • GLOB_NOSORT: Återvänd filer som de visas i katalogen (ingen sortering)
  • GLOB_NOCHECK: Återvänd sökmönstret om inga filer matchade den
  • GLOB_NOESCAPE: Backslashes citerar inte metakarakter
  • GLOB_BRACE: Expanderar a, b, c för att matcha "a", "b" eller "c"
  • GLOB_ONLYDIR: Returnera endast katalogposter som matchar mönstret
  • GLOB_ERR: Sluta på läsfel (som oläsliga kataloger), standardfel ignoreras

Som du ser kan de potentiella kraven som vi noterade i slutet av steg 1 enkelt sättas med GLOB_BRACE:

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

som kommer att returnera detta:

 Filnamn: userImages / användarnamn1 / TN / test.jpg Filnamn: userImages / användarnamn1 / TN / test3.jpg Filnamn: userImages / username2 / TN / test2.jpg Filnamn: userImages / username2 / TN / test4.gif 

Om vi ​​bara vill skriva ut undermappsnamn kan vi använda GLOB_ONLYDIR:

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

som kommer att skriva ut:

 Filnamn: userImages / användarnamn2 / TN / undermapp 

Slutsats och ett mer exempel

Denna metod har varit tillgänglig sedan PHP 4.3, men det används inte så ofta, konstigt. Jag lärde mig inte förrän ganska sent själv. Nu använder jag ofta glob () när du laddar plugins till mina ramar:

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

Det är allt; Jag hoppas att du haft det här snabba tipset och låt mig veta om du har några frågor!