Lister des dossier en PHP

Bonjour,
Voici mon problème:
J'ai un répertoire "albums" contenant des sous-répertoires A1, A2, A3,..... B1,B2,B3....etc..
Dans ces sous-répertoires il y 1 fichier .txt et des fichiers .jpg.
Dans certains sous-répertoires, il n'y a pas de fichiers .jpg
Le but:
je veux créer un tableau (<table>) dont une cellule affiche les noms des dossiers commençant par la lettre A, la suivante ceux commençant avec la lettre B, etc...
Jusque là je sais faire.
Voici mon code:
<?php
$rep = "albums/";
$dir = opendir($rep);
while ($dossier = readdir($dir)) {
if(is_dir($rep.$dossier)) {

if ($dossier != '.' && $dossier != '..' && $dossier{0}=='A'){

echo $dossier."<br>";
}}}
closedir($dir);
?>

Le problème:
je voudrais que si le dossier ne contient qu'un fichier .txt (pas de .jpg), son nom ne s'affiche pas dans la liste. Et là, je coince.:-(((
Si quelq'un a la solution....
Merci d'avance

6 réponses

  1. salut;
    pour chacun de tes $rep.$dossier tu fait dans ta boucle while et condition if:
    if(count(glob($rep.$dossier."*.txt")) === 0 )
    // tu fait ton traitement ici
    1. Merci pour ta réponse, mais ça ne fonctionne pas.:-(((
      J'ai essayé toutes les variantes possible, mais soit tout les répertoires s'affichent, soit aucun.
      Je voudrais que s'affichent uniquement les répertoires contenant des fichiers .jpg.

      voici ce que j'ai essayé:

      <?php
      $rep = "albums/";
      $dir = opendir($rep);
      while ($dossier = readdir($dir)) {
      if(is_dir($rep.$dossier)) {
      if ($dossier != '.' && $dossier != '..' && $dossier{0}=='A'){
      if(count(glob($rep.$dossier."*.jpg")) !== 0 )

      echo $dossier."<br>";
      }}} }
      closedir($dir);
      ?>

      ou encore

      <?php
      $rep = "albums/";
      $dir = opendir($rep);
      while ($dossier = readdir($dir)) {
      if(is_dir($rep.$dossier)) {
      if(count(glob($rep.$dossier."*.jpg")) !== 0 )
      if ($dossier != '.' && $dossier != '..' && $dossier{0}=='A'){
      echo $dossier."<br>";
      }}} }
      closedir($dir);
      ?>

      Rien ne fonctionne....

      Merci pour ton aide.
  2. Contributeur
    Bonjour,

    Moi j'irai plus vers la fonction substr().
    qui va extraire une chaine de caractère différent de "txt" (donc égal à "jpg")

    if (substr( $dossier, -3, 3) == "jpg" ) {
    echo $dossier;
    }

    pour plus d'info sur substr : http://www.manuelphp.com/php/function.substr.php

    @+

    Mieux vaut paraitre 'CON' 5mn, que de le rester toute sa vie.
    1. Merci pour aide à tous les deux.
      Mais je crois que vous "oublié" un détail (désolé:-))
      Mon arborescence est la suivante:
      albums/dossier1/texte.txt
      albums/dossier1/photo1.jpg
      albums/dossier1/photo2.jpg
      albums/dossier1/photo3.jpg

      albums/dossier2/texte.txt

      albums/dossier3/texte.txt
      albums/dossier3/photo1.jpg
      albums/dossier3/photo2.jpg
      albums/dossier3/photo3.jpg

      et la liste que je veux obtenir c'est:

      dossier1
      dossier3

      sans dossier 2, puisque celui-ci ne contient pas de photos.

      Je pense que vos deux solutions
      if(count(glob($rep.$dossier."*.jpg")) !== 0 )
      ou
      if (substr( $dossier, -3, 3) == "jpg" )

      peuvent fonctionner à condition d'arriver à lire le contenu des sous-repertoires dossier1, dossier2, dossier3 pour savoir si ils contiennent des .jpg. Si oui on affiche le dossier dans (pas les fichiers qu'il contient) dans la liste.
      Cette liste de dossier est en fait un sommaire donnant accés à l'album qui affichera les photos contenues dans le dossier correspondant.
      Je ne sais pas si je me fait bien comprendre.

      Donc enfait il faudrait que ce soit:
      if(count(glob($rep.$dossier.$photo."*.jpg")) !== 0 )
      ou
      if (substr( $photo, -3, 3) == "jpg" )

      Et tout le problème est que je ne sais pas comment obtenir $photo.;-((((((

      Merci
      1. Contributeur
        Bonsoir,

        Je me suis amusé à créer une petite fonction qui va permettre de réaliser ce que tu souhaites faire, à toi de l'améliorer.

        <?php
        function parcourir_repertoire($repertoire)
        {
        $le_repertoire = opendir($repertoire) ;
        while($fichier = @readdir($le_repertoire))
        {
        if ($fichier == "." || $fichier == "..") continue;

        if (is_dir($repertoire.'/'.$fichier)) {
        parcourir_repertoire($repertoire.'/'.$fichier);
        }
        else {
        if (substr( $fichier, -3, 3) == "jpg") {
        echo $repertoire.'/'.$fichier."<br />";
        }
        }

        }
        closedir($le_repertoire);
        }
        parcourir_repertoire('albums');
        ?>


        J'espère que ça va t'avancer un peu.

        @+
        1. Bonjour,

          Merci rescue, grace à ton code j'ai pu faire un truc qui approche ce que je veux faire. Voicile code que j'ai bidouillé à partir du tien:

          <?php
          $rep = "albums/";
          $dir = opendir($rep);
          while ($dossier = readdir($dir)) {

          if ($dossier != '.' && $dossier != '..' && $dossier[0]=='A'){
          if(is_dir($rep.$dossier)) {
          $sousdir = opendir($rep.$dossier);
          while ($fiche = readdir($sousdir)) {
          if (substr($fiche,-3) == "jpg") {
          echo $dossier."<br>";
          }}}}}
          closedir($dir);
          ?>

          Le seul problème qu'il me reste, c'est qu'il m'affiche autant de fois le nom du répertoire ($dossier) qu'il y a de fichiers .jpg ($fiche) dans celui-ci.

          N'y a-t-il pas une fonction identique à GROUP BY en Mysql pour que le nom ne s'affiche qu'une seul fois?
          J'ai pas mal cherché sur internet sans rien trouver.;-(((
          bon, je ne suis pas très doué en php.........

          Merci d'avance et bon dimanche à tous
          1. Contributeur
            Bonsoir,

            Cela doit être possible, mais pour le moment je n'ai aucune d'idée.
            Il va falloir réfléchir plus consciencieusement.
            A moins qu'une autre personne de la communauté trouve la solution.

            @+
            1. En attendant merci pour ton aide.

              A+