IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

boucle foreach à 2 variables.


Sujet :

Langage PHP

  1. #1
    Membre actif Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Points : 241
    Points
    241
    Par défaut boucle foreach à 2 variables.
    Bonjour, j'ai quelques problèmes avec la commande foreach.

    Je réussi à lister le contenu d'un répertoire selon ce que le répertoire contient. Mais, je n'arrive pas à
    lister le contenu de deux répertoire dans la même boucle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    <?php
    function list_directory($dir) {
       $file_list = array();
       $stack[] = $dir;
     
       while ($stack) {
           $current_dir = array_pop($stack);
           if ($dh = opendir($current_dir)) {
               while (($file = readdir($dh)) !== false) {
                   if ($file !== '.' AND $file !== '..') {
                       $current_file = "{$current_dir}/{$file}";
                       $report = array();
                       if (is_file($current_file)) {
                           $file_list[] = "{$current_dir}/{$file}";
                       } elseif (is_dir($current_file)) {
                           $stack[] = $current_file;
                           $file_list[] = "{$current_dir}/{$file}/";
                       }
                   }
               }
           }
       }
     
       return $file_list;
    }
     
    $tns =list_directory('./tns');
    $img =list_directory('./img');
     
    foreach ($tns as $tnslist => $img){
      echo '<a href="/img/'.$img.'"><img width="50" src="'.$tnslist.'"></a>';
    }
     
    ?>
    J'arrive à afficher une image mais pas l'autre répertoire d'image. Si je clique sur la petite image, ça doit afficher la grosse image. Quelqu'un peut m'aider?
    On oublie souvent la simplicité ou la base dans la vie: Maslow

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut

    Si je comprends bien "tns" contient des miniatures et "img" les images en taille réelle.
    Tu n'as donc pas besoin de parcourir les deux dossiers, je suppose que le nom d'une miniature est basée sur le nom de l'image normale.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $lstimg = list_directory('./img');
     
    foreach ($lstimg as $img){
      echo '<a href="/img/'.$img.'"><img width="50" src="/tns/'.$img.'"></a>';
    }
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre actif Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Points : 241
    Points
    241
    Par défaut
    J'ai fini par y arriver en faisant comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $tns =list_directory('./tns');
    $img =list_directory('./img');
     
    foreach($tns as $index => $value) {
        echo '<a href="'.$img[$index].'"><img width="50" src="'.$tns[$index].'"></a>';
    }
    Les tns sont les miniatures et img les grande images.

    Ça fonctionne. J'ai juste maintenant besoin de convertir en smarty le foreach dans le fichier .tpl
    Je ne sais pas comment le faire avec smarty.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $tns =list_directory('web/img/tns');
    $img =list_directory('web/img/img');
     
    $smarty->assign('tnslist', $tns);
    $smarty->assign('imglist', $img);
    On oublie souvent la simplicité ou la base dans la vie: Maslow

  4. #4
    Membre actif Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Points : 241
    Points
    241
    Par défaut
    @sabotage,
    Je tente l essaie de votre solution..

    réponse:

    ne peut pas marcher vu que ./img est définie une 2e fois dans le url.

    ma solution marche. il s agit que je mette le foreach en smarty... c est ce qui me manque.
    On oublie souvent la simplicité ou la base dans la vie: Maslow

  5. #5
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    ne peut pas marcher vu que ./img est définie une 2e fois dans le url.
    Je n'ai pas compris le problème.

    Mais la façon dont tu procèdes n'est pas bonne. Déjà ça fait une lecture du répertoire pour rien, ensuite ça ne fonctionne que si tu as le même nombre de fichier et qu'ils sortent dans le même ordre.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  6. #6
    Membre actif Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Points : 241
    Points
    241
    Par défaut
    En faite, ce que j’essaie de faire, c'est de lister les répertoires images et miniatures.

    C'est un album d'images.

    Si j'ajoute des images, il faut les voir sans ajouter de codes.

    Mon code exige que les miniature soit le même nom que la grande image.

    /photos/img/1.jpg
    /photo/miniature/1.jpg
    On oublie souvent la simplicité ou la base dans la vie: Maslow

  7. #7
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Ca tombe bien dans le code que je te propose, l'image a le même nom que la miniature.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  8. #8
    Membre actif Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Points : 241
    Points
    241
    Par défaut
    Ma fonction sert à définir le chemin des images. Il ne peut pas être redéfini.

    ./img et ./tns sont défini par la fonction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $tns =list_directory('./tns');
    $img =list_directory('./img');
    Si je fais $tns[3] et $img[3], c'est la 4e images qui sort.

    la miniature est /tns/004.jpg pour $tns
    l'image est /img/004.jpg pour $img

    comme vous proposez, ça donne ceci: /img/./img/004.jpg

    donc, je ne peux pas faire puisque le répertoire sera mis 2 fois. A moins de changer la fonction.
    On oublie souvent la simplicité ou la base dans la vie: Maslow

  9. #9
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Sans modifier ta fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $lstimg = list_directory('./img');
     
    foreach ($lstimg as $img){
      echo '<a href="'.$img.'"><img width="50" src="/tns/'.basename($img).'"></a>';
    }
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  10. #10
    Membre actif Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Points : 241
    Points
    241
    Par défaut
    Cette solution fonctionne en PHP mais à cause de basename, en smarty, ça ne fonctionne pas.

    le côté PHP :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $smarty->assign('liste', $lstimg)
    ;

    le côté Smarty:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    {section name=name loop=$liste}
    <a href={$liste[name]}><img width="50" src={$liste[name]}></a>
    {/section}
    ça affiche seulement les petites images.
    On oublie souvent la simplicité ou la base dans la vie: Maslow

  11. #11
    Membre actif Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Points : 241
    Points
    241
    Par défaut
    Sabotage, j'ai refais ma fonction et là, ça marche. Il fallait aussi que je fasse en version Smarty.

    PHP:
    A pour rôle d'afficher que les fichiers situé dans /web/img/img

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <?php
            function liste($l){
                    if ($handle = opendir($l)) {
                            while (false !== ($entry = readdir($handle))) {
                                    if ($entry != "." && $entry != "..") {
                                            $la[] = $entry;
                                    }
                            }
                            closedir($handle);
                    }
            return $la; 
            }
     
            $i = liste('./web/img/img');
            $smarty->assign('i', $i);
    ?>
    A pour rôle d'afficher en template mais comme ma fonction ne fait qu'afficher le contenu
    du répertoire /img/, on doit indiquer les répertoire conteneur des images.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    {foreach from=$i item=ll}
        <a href="./web/img/img/{$ll}"><img width="50" src="./web/img/tns/{$ll}"></a>
    {/foreach}
    Alors, tout marche avec Smarty.

    Merci pour votre aide, ça m'a permis de mieux comprendre des choses.
    On oublie souvent la simplicité ou la base dans la vie: Maslow

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PowerShell] Conserver une variable dans une boucle Foreach
    Par sirefen dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 07/06/2013, 15h41
  2. indérer une variable dans une boucle foreach
    Par manuso dans le forum Langage
    Réponses: 4
    Dernier message: 14/10/2012, 09h49
  3. [XSLT] Faire une boucle sur une variable [i]
    Par PoT_de_NuTeLLa dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 07/06/2010, 12h45
  4. [Tableaux] la boucle foreach
    Par jeanfrancois dans le forum Langage
    Réponses: 7
    Dernier message: 09/03/2006, 17h29
  5. Faire une boucle avec des variables vides ?
    Par byloute dans le forum Linux
    Réponses: 5
    Dernier message: 23/02/2006, 09h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo