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.
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..
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.
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 ().
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
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.!