Snelle tip Loop Through Folders met PHP's Glob ()

Gebruikt u nog steeds opendir () om door mappen in PHP te bladeren? Heeft dat niet elke keer dat je een map wilt doorzoeken veel herhalingscode nodig? Gelukkig is PHP's glob () een veel slimmere oplossing.


Invoering

Hier is een voorbeeld van het echoën van wat informatie uit een map, met behulp van de traditionele opendir () -functie.

 $ dir = "/ etc / php5 /"; // Open een bekende map en ga verder met het lezen van de inhoud if (is_dir ($ dir)) if ($ dh = opendir ($ dir)) while (($ file = readdir ($ dh))! == false ) echo "bestandsnaam: $ bestand: bestandstype:". bestandstype ($ dir. $ bestand). "\ N";  closedir ($ dh);  

Dat zou er enigszins bekend uit moeten zien. We kunnen de bovenstaande code massaal inkorten met:

 $ dir = "/ etc / php5 / *"; // Open een bekende map en ga verder met het lezen van de inhoud foreach (glob ($ dir) als $ bestand) echo "filename: $ file: filetype:". bestandstype ($ bestand). "
";

Is dat niet veel gemakkelijker? Wil je weten hoe de methode werkt? Zo ja, laten we dan doorgaan.

glob () ondersteunt in totaal twee argumenten, waarbij het tweede argument optioneel is. Het eerste argument is het pad naar de map, maar het is een beetje krachtiger dan dat.


Stap 1. Het eerste argument

Dit eerste argument ondersteunt een patroon. Dit betekent dat u de zoekopdracht kunt beperken tot specifieke bestandstypen of zelfs meerdere mappen tegelijkertijd door meerdere asterixen "*" te gebruiken. Laten we aannemen dat je een website hebt waarmee gebruikers afbeeldingen kunnen uploaden (alleen omdat ik dit lees). Elke gebruiker heeft zijn / haar eigen map in de map "userImages." In deze map bevinden zich twee extra mappen, genaamd "HD" en "TN", voor afbeeldingen in hoge definitie (op ware grootte) en voor miniaturen. Laten we ons voorstellen dat je alle "TN" -mappen van je gebruikers wilt doorlopen en de bestandsnamen wilt afdrukken. Dit zou een relatief groot codefragment vereisen als u open_dir () zou gebruiken; met glob () is het echter eenvoudig.

 foreach (glob ('userImages / * / TN / *') als $ afbeelding) echo "Bestandsnaam:". $ afbeelding. "
";

Dit zal userImages / any / TN / any zoeken en zal een lijst van de bestanden retourneren die overeenkomen met het patroon.

 Bestandsnaam: userImages / gebruikersnaam1 / TN / test.jpg Bestandsnaam: userImages / gebruikersnaam1 / TN / test3.jpg Bestandsnaam: userImages / gebruikersnaam1 / TN / test5.png Bestandsnaam: userImages / gebruikersnaam2 / TN / submap Bestandsnaam: userImages / gebruikersnaam2 / TN / test2.jpg Bestandsnaam: userImages / gebruikersnaam2 / TN / test4.gif Bestandsnaam: userImages / gebruikersnaam3 / TN / styles.css 

We kunnen zelfs een stap verder gaan en specifieker zijn door een bestandsindeling op te nemen in onze foreach-verklaring:

 foreach (glob ('userImages / * / TN / *. jpg') als $ afbeelding) echo "Bestandsnaam:". $ afbeelding. "
";

Dit zal alleen Jpegs retourneren.

 Bestandsnaam: userImages / gebruikersnaam1 / TN / test.jpg Bestandsnaam: userImages / gebruikersnaam1 / TN / test3.jpg Bestandsnaam: userImages / username2 / TN / test2.jpg 

Het wordt nog beter. Wat als u bijvoorbeeld Jpeg's, maar ook Gifs nodig hebt; niks anders? Of wat als u alleen mapnamen wilt afdrukken? Dit is waar het tweede argument in het spel komt.


Stap 2. Het tweede argument

Het tweede argument is, zoals eerder vermeld, optioneel. Het biedt echter een hele mooie reeks optionele vlaggen. Hiermee kunt u de manier wijzigen waarop uw glob () zich gedraagt.

  • GLOB_MARK: Voegt een schuine streep toe aan elke geretourneerde map
  • GLOB_NOSORT: Bestanden terugsturen zoals ze in de directory verschijnen (niet sorteren)
  • GLOB_NOCHECK: Retourneer het zoekpatroon als er geen overeenkomende bestanden zijn gevonden
  • GLOB_NOESCAPE: Backslashes citeren geen metatekens
  • GLOB_BRACE: Breidt a, b, c uit om overeen te komen met 'a', 'b' of 'c'
  • GLOB_ONLYDIR: Retourneer alleen directory-items die overeenkomen met het patroon
  • GLOB_ERR: Stop bij leesfouten (zoals onleesbare mappen), standaard worden fouten genegeerd

Zoals u ziet, kunnen de potentiële vereisten die we aan het einde van stap 1 hebben genoteerd eenvoudig worden opgelost met GLOB_BRACE:

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

welke dit zal teruggeven:

 Bestandsnaam: userImages / gebruikersnaam1 / TN / test.jpg Bestandsnaam: userImages / gebruikersnaam1 / TN / test3.jpg Bestandsnaam: userImages / gebruikersnaam2 / TN / test2.jpg Bestandsnaam: userImages / username2 / TN / test4.gif 

Als we alleen submappennamen willen afdrukken, kunnen we GLOB_ONLYDIR gebruiken:

 foreach (glob ('userImages / * / TN / *', GLOB_ONLYDIR) als $ afbeelding) echo "Bestandsnaam:". $ afbeelding. "
";

welke zal afdrukken:

 Bestandsnaam: userImages / gebruikersnaam2 / TN / submap 

Conclusie en nog een voorbeeld

Deze methode is beschikbaar sinds PHP 4.3, maar wordt niet vaak gebruikt, vreemd. Ik heb het zelf pas vrij laat geleerd. Ik gebruik vaak glob () bij het laden van plug-ins in mijn framework:

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

Dat is alles; Ik hoop dat je deze snelle tip leuk vond en laat het me weten als je nog vragen hebt!