Petit conseil faites une boucle dans les dossiers avec PHP (Glob)

Utilisez-vous toujours opendir () pour parcourir en boucle les dossiers en PHP? Cela ne nécessite-t-il pas beaucoup de code répétitif chaque fois que vous souhaitez effectuer une recherche dans un dossier? Heureusement, glob () de PHP est une solution beaucoup plus intelligente.


introduction

Voici un exemple d’échange d’informations d’un dossier en utilisant la fonction traditionnelle opendir ().

 $ dir = "/ etc / php5 /"; // Ouvre un répertoire connu et continue à lire son contenu if (is_dir ($ dir)) if ($ dh = opendir ($ dir)) while (($ file = readdir ($ dh))!! == false ) echo "nom du fichier: $ fichier: type de fichier:". filetype (fichier $ dir. $). "\ n";  closedir ($ dh);  

Cela devrait sembler un peu familier. Nous pouvons massivement raccourcir le code ci-dessus avec:

 $ dir = "/ etc / php5 / *"; // Ouvre un répertoire connu et continue à lire son contenu foreach (glob ($ dir) en tant que $ fichier) echo "nom_fichier: $ fichier: type_fichier:". filetype ($ file). "
";

N'est-ce pas beaucoup plus facile? Désireux d'apprendre comment fonctionne la méthode? Si oui, alors passons à l'action.

glob () supporte un total de deux arguments, le second argument étant optionnel. Le premier argument est le chemin du dossier, mais il est un peu plus puissant que cela..


Étape 1. Le premier argument

Ce premier argument supporte un motif. Cela signifie que vous pouvez limiter la recherche à des types de fichiers spécifiques ou même à plusieurs annuaires en même temps en utilisant plusieurs astérixes "*". Supposons que vous disposiez d'un site Web permettant aux utilisateurs de télécharger des images (simplement parce que j'ai lu ceci). Chaque utilisateur a son propre dossier dans le dossier "userImages". Dans ce dossier se trouvent deux dossiers supplémentaires, appelés "HD" et "TN", pour les images haute définition (pleine taille) et pour les miniatures. Imaginons que vous souhaitiez parcourir tous les dossiers "TN" de vos utilisateurs et imprimer les noms de fichiers. Cela nécessiterait un extrait de code relativement volumineux si vous utilisiez open_dir (); Cependant, avec glob (), c'est facile.

 foreach (glob ('userImages / * / TN / *') en tant que $ image) echo "Nom du fichier:". $ image. "
";

Ceci recherchera userImages / any / TN / any et renverra une liste des fichiers correspondant au modèle..

 Nom de fichier: userImages / username1 / TN / test.jpg Nom de fichier: userImages / username1 / TN / test3.jpg Nom de fichier: userImages / username1 / TN / test5.png Nom de fichier: userImages / username2 / TN / sous-dossier Nom de fichier: userImages / username2 / TN / test2.jpg Nom de fichier: userImages / username2 / TN / test4.gif Nom de fichier: userImages / username3 / TN / styles.css 

Nous pouvons même aller plus loin et être plus précis en incluant un format de fichier dans notre déclaration foreach:

 foreach (glob ('userImages / * / TN / *. jpg') en tant que $ image) echo "Nom du fichier:". $ image. "
";

Maintenant, cela ne retournera que des Jpeg.

 Nom de fichier: userImages / username1 / TN / test.jpg Nom de fichier: userImages / username1 / TN / test3.jpg Nom de fichier: userImages / username2 / TN / test2.jpg 

Ça va encore mieux. Et si, par exemple, vous avez besoin de fichiers Jpeg, mais également de gifs; rien d'autre? Ou si vous voulez imprimer uniquement les noms de dossiers? C'est là que le deuxième argument entre en jeu.


Étape 2. Le deuxième argument

Le deuxième argument est, comme mentionné précédemment, facultatif. Cependant, il fournit un très bel ensemble de drapeaux facultatifs. Celles-ci vous permettront de changer le comportement de glob ().

  • GLOB_MARK: Ajoute une barre oblique à chaque répertoire retourné
  • GLOB_NOSORT: Retourne les fichiers tels qu'ils apparaissent dans le répertoire (pas de tri)
  • GLOB_NOCHECK: Renvoie le modèle de recherche si aucun fichier correspondant n'a été trouvé
  • GLOB_NOESCAPE: Les barres obliques inverses ne citent pas les métacaractères
  • GLOB_BRACE: Étend a, b, c pour correspondre à 'a', 'b' ou 'c'
  • GLOB_ONLYDIR: Renvoie uniquement les entrées de répertoire qui correspondent au modèle
  • GLOB_ERR: Arrête sur les erreurs de lecture (comme les répertoires illisibles), par défaut les erreurs sont ignorées

Comme vous le voyez, les exigences potentielles notées à la fin de l'étape 1 peuvent facilement être corrigées avec GLOB_BRACE:

 foreach (glob ('userImages / * / TN / *. jpg, *. gif', GLOB_BRACE) en tant que $ image) echo "Nom du fichier:". $ image. "
";

qui retournera ceci:

 Nom de fichier: userImages / username1 / TN / test.jpg Nom de fichier: userImages / username1 / TN / test3.jpg Nom de fichier: userImages / username2 / TN / test2.jpg Nom de fichier: userImages / username2 / TN / test4.gif 

Si nous souhaitons uniquement imprimer les noms de sous-dossiers, nous pourrions utiliser GLOB_ONLYDIR:

 foreach (glob ('userImages / * / TN / *', GLOB_ONLYDIR) en tant que $ image) echo "Nom du fichier:". $ image. "
";

qui va imprimer:

 Nom de fichier: userImages / username2 / TN / subfolder 

Conclusion et un autre exemple

Cette méthode est disponible depuis PHP 4.3, cependant, elle n'est pas utilisée très souvent, étrangement. Je ne l'ai appris que tardivement. Maintenant, j'utilise souvent glob () lors du chargement de plugins dans mon framework:

 foreach (glob ('includes / plugins / *. php') en tant que $ plugin) include_once ($ plugin);  

C'est tout; J'espère que vous avez apprécié ce petit conseil et faites-le moi savoir si vous avez des questions.!