N'afficher qu'un seule valeur lors d'un foreach

Réduire
X
 
  • Filtrer
  • Heure
  • Afficher
Tout effacer
nouveaux messages

  • N'afficher qu'un seule valeur lors d'un foreach

    hello a tous je bute sur un truc un peu bête, j'ai un foreach et je ne voudrais affcihé qu'un seule valeur dans la boucle ...
    sachant que je ne peu le faire par SQL
    En fait je parcoure les données dans une liste d'article pour récupérer la valeur contenu dans un champs et moi j'affiche le nom du champ ... c'est un peu tordu mais c'est un peu imposé par la structure meme du projet (je peu pas rajouté de requette sql pour éviter de hacké
    Code:
    <?php
    foreach ($arrayFilter_Field as $Filterfield):
                      FlexicontentFields::getFieldDisplay($item, $Filterfield);
                      $value= $item->fields[$Filterfield]->display;
                      if (!empty($value)) :?>
    <button class="button" data-filter=".<?php echo $value; ?>"><?php echo JText::_($value); ?></button>
    <?php endif; ?>
    <?php endforeach; ?>
    je ne voudrais afficher qu'une seule valeur de chaque $value
    des idées ?
    Dernière édition par cavo789 à 05/02/2018, 21h22
    Société : http://www.com3elles.com
    Bénévole : http://www.flexicontent.org

  • #2
    Hello,
    J'ai pas forcément tout compris sur ton besoin, mais j'ai l'impression que la solution c'est l'instruction PHP "Break" ?!
    PHP is a popular general-purpose scripting language that powers everything from your blog to the most popular websites in the world.


    Ainsi quand tu as trouvé ce que tu veux, tu fais ... un break

    ... ou si tu veux rester dans le foreach et passser directement à la prochaine itération :
    PHP is a popular general-purpose scripting language that powers everything from your blog to the most popular websites in the world.


    Ainsi quand tu as trouvé ce que tu veux, tu fais ... un "continue" avec le prochain field
    Dernière édition par garstud à 05/02/2018, 16h02
    Garstud Workshop - Concepteur, Développeur et Formateur Joomla - http://www.garstud.com
    « Ce n’est pas parce que les choses sont difficiles que nous n’osons pas,
    c’est parce que nous n’osons pas qu’elles sont difficiles. »
    - Sénèque

    Commentaire


    • #3
      En fait ma boucle liste tout les champs contenus dans les articles et leur valeurs
      le truc c'est que plusieur articles peuvent avoir une valeur identique
      genre j'obtiens une liste : bleu rouge rouge bleu vert
      moi je voudrais affiché que bleu rouge vert
      tu comprend mieux, maitre ?
      Société : http://www.com3elles.com
      Bénévole : http://www.flexicontent.org

      Commentaire


      • #4
        Ok, faut stocker chaque valeur trouvée dans un tableau ... en verifiant avant qu'elle ne s'y trouve pas deja
        Garstud Workshop - Concepteur, Développeur et Formateur Joomla - http://www.garstud.com
        « Ce n’est pas parce que les choses sont difficiles que nous n’osons pas,
        c’est parce que nous n’osons pas qu’elles sont difficiles. »
        - Sénèque

        Commentaire


        • #5
          Bonjour,

          Peut-être à faire lors de la requête SQL avec un DISTINCT
          UP, le plugin universel à découvrir sur https//up.lomart.fr
          bgMax
          , AdminOrder, MetaData, Zoom, ArtPlug, Custom, Memo, Filter, ... sur http://lomart.fr/extensions

          Commentaire


          • #6
            Le soucis c'est que je peu pas travailler sur le sql sans éditer le core l'idée étant de faire le travail dans un template de module
            Marc donc dans le foreach il faut que je fasse un tableau ? J'avais regarder côté array_unique mais j'ai pas encore trouvé comment m'en servir....
            Société : http://www.com3elles.com
            Bénévole : http://www.flexicontent.org

            Commentaire


            • #7
              Avec un in_array() cela doit le faire...

              Je tape sans tester :

              Code:
              $arr = array();
              if (!in_array($arr, $value)) {
                   $arr[] = $value;
                   // Do something
              }
              Si in_array est faux et donc pas dans le tableau, tu fais ton traitement et tu stockes la valeur ainsi, la prochaine fois, in_array sera à true pour cette même valeur.
              Christophe (cavo789)
              Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be
              Logiciel gratuit de scan antivirus : https://github.com/cavo789/aesecure_quickscan (plus de 45.000 virus détectés, 700.000 fichiers sur liste blanche)​

              Commentaire


              • #8
                Un peu plus de temps pour te faire un exemple :

                Code PHP:
                <?php

                // Non unique
                echo '<h2>Non unique - 20 nombres aléatoires</h2><ol>';
                for(
                $i=1;$i<=20;$i++){ 
                    
                $value rand(0,20); 
                    echo 
                '<li>'.$value.'</li>';

                echo 
                '</ol>';

                // Unique
                echo '<h2>Unique - 20 nombres aléatoires</h2><ol>';
                $arr = array();
                for(
                $i=1;$i<=20;$i++){ 
                    
                $value rand(0,20); 
                    if (!
                in_array($value,$arr)) {
                        
                $arr[] = $value;
                        echo 
                '<li>'.$value.'</li>';
                    }
                }
                echo 
                '</ol>';

                // Tri le tableau pour l'afficher ensuite
                sort($arr);
                echo 
                '<pre>'.print_r($arrtrue).'</pre>';

                Cela peut donner quelque chose ceci :
                Non unique - 20 nombres aléatoires <-- un même nombre peut revenir

                1. 6
                2. 17
                3. 18
                4. 9
                5. 12
                6. 18
                7. 0
                8. 1
                9. 17
                10. 2
                11. 10
                12. 2
                13. 2
                14. 17
                15. 2
                16. 11
                17. 1
                18. 15
                19. 6
                20. 17
                Unique - 20 nombres aléatoires <-- un même nombre : un seul affichage

                1. 16
                2. 0
                3. 17
                4. 18
                5. 8
                6. 1
                7. 5
                8. 7
                9. 19
                10. 11
                11. 3
                12. 12
                13. 4

                Array ( [0] => 0 [1] => 1 [2] => 3 [3] => 4 [4] => 5 [5] => 7 [6] => 8 [7] => 11 [8] => 12 [9] => 16 [10] => 17 [11] => 18 [12] => 19 )
                Christophe (cavo789)
                Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be
                Logiciel gratuit de scan antivirus : https://github.com/cavo789/aesecure_quickscan (plus de 45.000 virus détectés, 700.000 fichiers sur liste blanche)​

                Commentaire


                • #9
                  alors je te suis petit maitre belge
                  Code:
                    foreach ($arrayFilter_Field as $Filterfield):
                                FlexicontentFields::getFieldDisplay($item, $Filterfield);
                                $value= $item->fields[$Filterfield]->display;
                                $arrayValue= array($value);
                                print_r ($arrayValue);
                                  if ((!in_array($value,$arrayValue))) :
                                    $arrayValue[] = $value;
                            ?>
                            <button class="button" data-filter=".<?php echo $value;  ?>"><?php echo JText::_($value); ?></button>
                                  <?php endif; ?>
                                <?php endforeach; ?>
                  le coquin ne me renvois rien .... je n'ai aucun de mes boutons
                  pourtant
                  Code:
                  print_r ($arrayValue);
                  me renvois
                  [code]Array ( [0] => Super Utilisateur ) Array ( [0] => mercredi 10 janvier 2018 ) Array ( [0] => Super Utilisateur ) Array ( [0] => lundi 5 février 2018 )[code]
                  je devrais (si j'arrive a corriger ma boulette, avoir
                  Code:
                  Array ( [0] => Super Utilisateur ) Array ( [0] => mercredi 10 janvier 2018 ) Array ( [0] => lundi 5 février 2018 )
                  qu'ai je loupé ?
                  Société : http://www.com3elles.com
                  Bénévole : http://www.flexicontent.org

                  Commentaire


                  • #10
                    Bah ça, une fois (faut forcer le trait belge), c'est normal.

                    remplace :

                    $arrayValue= array($value);

                    par

                    $arrayValue= array();

                    Et sors cette déclaration du foreach; mets le avant toute chose.

                    Pourquoi ? Parce que tu crées à chaque fois un tableau d'un seul élément et tu y stockes déjà ta valeur puis tu demandes "Est-ce que la valeur s'y trouve?" "ben oui, chef, vu que tu l'as stocké deux lignes plus haut".

                    (écrit en mode taquin)
                    Christophe (cavo789)
                    Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be
                    Logiciel gratuit de scan antivirus : https://github.com/cavo789/aesecure_quickscan (plus de 45.000 virus détectés, 700.000 fichiers sur liste blanche)​

                    Commentaire


                    • #11
                      Proposition :

                      Code PHP:
                      <?php

                      $arrayValue 
                      = array();

                      foreach (
                      $arrayFilter_Field as $Filterfield) {

                          
                      FlexicontentFields::getFieldDisplay($item$Filterfield);

                          
                      $value $item->fields[$Filterfield]->display;

                          if ((!
                      in_array ($value$arrayValue))) {
                              
                      // Store the value so we can process it only once
                              
                      $arrayValue[] = $value;        

                              
                      // Display the button
                              
                      echo '<button class="button" data-filter="'.$value.'">'.JText::_($value).'</button>';        
                          } 
                      // if                
                      // foreach
                      Perso, je déteste de coder ici en php puis du html puis re du PHP, etc. Je trouve cela vraiment compliqué à relire et à maintenir.

                      D'où ma proposition de faire l'affichage du bouton avec un echo, en php donc.
                      Christophe (cavo789)
                      Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be
                      Logiciel gratuit de scan antivirus : https://github.com/cavo789/aesecure_quickscan (plus de 45.000 virus détectés, 700.000 fichiers sur liste blanche)​

                      Commentaire


                      • #12
                        je comprend le pourquoi grace a toi .... mais je n'arrive pas a trouver la logique .... avec mon cerveau limité .....
                        revoici mon code commenté pour essayer de le rendre plus lisible
                        Code:
                        <?php foreach ($arrayFilter_Field as $Filterfield): // Pour chaque champs (c'est un parametre joomla que je recupere dans un tableau)
                                          FlexicontentFields::getFieldDisplay($item, $Filterfield); // j'appelle une fonction qui me permet de parcourir les articles sélectionnés plus haut et de trouver la valeur contenus dans les champs au-dessus
                                          $value= $item->fields[$Filterfield]->display;// suite de la fonction
                                          if (!empty($value)) : //si cette valeur n'est pas vide
                                            ?>
                        <button class="button" data-filter=".<?php echo $value;  ?>"><?php echo JText::_($value); // j'affiche un bouton avec la valeur ?></button>
                        <?php endif;  // fin du test de valeur?>
                        <?php endforeach; // fin de la boucle?>
                        je n'arrive a comprendre ou faire le test des valeurs
                        Société : http://www.com3elles.com
                        Bénévole : http://www.flexicontent.org

                        Commentaire


                        • #13
                          Ton code ne reprends plus aucun test "si déjà affiché alors ne rien faire"

                          Le code ci-dessous ne fonctionne pas ?

                          Que contient $value ? Une chaine de caractères ? (cette question parce que display me fait penser non pas à une valeur mais une fonction)

                          Code PHP:
                          <?php 

                          $arrayValue 
                          = array();

                          // Pour chaque champs (c'est un parametre joomla que je recupere 
                          // dans un tableau)
                          foreach ($arrayFilter_Field as $Filterfield) {    
                              
                          // j'appelle une fonction qui me permet de parcourir 
                              // les articles sélectionnés plus haut et de trouver 
                              // la valeur contenus dans les champs au-dessus

                              
                          FlexicontentFields::getFieldDisplay($item$Filterfield); 

                              
                          // suite de la fonction
                              
                          $value $item->fields[$Filterfield]->display;

                              if (!empty(
                          $value)) {
                                  if ((!
                          in_array ($value$arrayValue))) {
                                      
                          //si cette valeur n'est pas vide et pas encore traitée
                                      // j'affiche un bouton avec la valeur
                                      
                          echo '<button class="button" data-filter="'.$value.'">'.JText::_($value).'</button>';        
                                  } 
                          // if                
                              
                          // if                
                          // foreach
                          Christophe (cavo789)
                          Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be
                          Logiciel gratuit de scan antivirus : https://github.com/cavo789/aesecure_quickscan (plus de 45.000 virus détectés, 700.000 fichiers sur liste blanche)​

                          Commentaire


                          • #14
                            oui value est string tout simple
                            j'ai testé ton code, j'ai les boutons mais les doublons lol
                            Mille merci pour ta patience pas simple d'apprendre et de comprendre tout les tenants et aboutissant qu'on est autodidacte pas éclairé lol
                            Société : http://www.com3elles.com
                            Bénévole : http://www.flexicontent.org

                            Commentaire


                            • #15
                              Oh crotte j'ai récupéré ton dernier code et je n'ai pas vu que tu avais skippé une ligne importante : la sauvegarde dans le tableau

                              Code PHP:
                              <?php 

                              $arrayValue 
                              = array();

                              // Pour chaque champs (c'est un parametre joomla que je recupere 
                              // dans un tableau)
                              foreach ($arrayFilter_Field as $Filterfield) {    
                                  
                              // j'appelle une fonction qui me permet de parcourir 
                                  // les articles sélectionnés plus haut et de trouver 
                                  // la valeur contenus dans les champs au-dessus

                                  
                              FlexicontentFields::getFieldDisplay($item$Filterfield); 

                                  
                              // suite de la fonction
                                  
                              $value $item->fields[$Filterfield]->display;

                                  if (!empty(
                              $value)) {
                                      if ((!
                              in_array ($value$arrayValue))) {
                                          
                              //si cette valeur n'est pas vide et pas encore traitée
                                          // j'affiche un bouton avec la valeur
                                          
                              echo '<button class="button" data-filter="'.$value.'">'.JText::_($value).'</button>';        

                                          
                              // On stocke la valeur pour ne plus la traiter à l'avenir
                                          
                              $arrayValue[] = $value;
                                      } 
                              // if                
                                  
                              // if                
                              // foreach
                              Christophe (cavo789)
                              Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be
                              Logiciel gratuit de scan antivirus : https://github.com/cavo789/aesecure_quickscan (plus de 45.000 virus détectés, 700.000 fichiers sur liste blanche)​

                              Commentaire

                              Annonce

                              Réduire
                              Aucune annonce pour le moment.

                              Partenaire de l'association

                              Réduire

                              Hébergeur Web PlanetHoster
                              Travaille ...
                              X