Partage
  • Partager sur Facebook
  • Partager sur Twitter

Incompréhension fgetcsv() dans un for

Sujet résolu
    18 mai 2021 à 13:39:39

    Bonjour, je me doute que c'est une demande peu commune.

    Pour faire simple j'étais en train de faire des tests sur la fonction fgetcsv(), pour l'intégrer par la suite dans mon projet. Et par curiosité j'ai voulu la mettre dans un for, et à ma grande surprise ça à fonctionné mais je ne comprends pas du tout comment :lol:.

    Mon CSV comporte 4 lignes et que je mette $i=0 ou $i=6 (par exemple), ça me scannera quand même les 4 lignes de mon CSV. En bref j'aimerais bien comprendre comment mon for fonctionne, si quelqu'un à la patience de m'expliquer je serai preneur, merci d'avance.

    // Analyse le CSV avec fgetcsv
    $file = fopen($_FILES["fichier"]["tmp_name"], "r");
    for ($i=0; $i<$getData = fgetcsv($file, 10000, ","); $i++) {
    	echo "Ligne $i : $getData[0], $getData[1], $getData[2], $getData[3], $getData[4], $getData[5], $getData[6]<BR>";
    }



    -
    Edité par Kévin_ 18 mai 2021 à 13:40:14

    • Partager sur Facebook
    • Partager sur Twitter
      18 mai 2021 à 14:44:24

      Salut,

      - $getData contient un tableau des champs de la ligne renvoyé par la fonction fgetcsv

      fgetcsv renvoi la ligne suivante a chaque appel, quand il n'y en a plus, ça renvoi false. Tu as tout dans la documentation.

      -
      Edité par xoxotf 18 mai 2021 à 14:44:40

      • Partager sur Facebook
      • Partager sur Twitter
        18 mai 2021 à 15:00:13

        Merci, j'ai bien compris comment fonctionne fgetcsv, mais ce que je n'ai pas compris c'est comment elle peut fonctionner dans un for comme je l'ai fait ci-dessus. Surtout que je n'ai vu personne utilisée un fgetcsv dans un for en regardant rapidement sur internet, en général il est utilisé dans while comme ceci : 
        while(($getData = fgetcsv($file, 10000, ",")) == true)
        • Partager sur Facebook
        • Partager sur Twitter
          18 mai 2021 à 15:00:15

          C'est juste un énorme coup de bol que ça fonctionne d'une certaine façon parce que ta condition est fausse et n'a aucun sens pour commencer : on ne compare pas des fraises à des choux.

          fgetcsv renvoie un tableau avec les données de la ligne sinon FALSE

          Or un tableau est toujours plus grand qu'autre chose qu'un tableau :

          > array N'importe quoi Le tableau est toujours plus grand

          Ce qui rend la condition toujours vraie si fgetcsv renvoie un tableau si tu la compares à un entier et qu'importe l'opérateur de comparaison (<(=) comme >(=))

          Par contre, quand tu arrives en fin de fichier, elle renvoie FALSE (soit 0) qui ne sera jamais strictement supérieure à $i vu qu'elle débute à 0.

          > Mon CSV comporte 4 lignes

          Ce n'est pas pour autant qu'une boucle for est appropriée. Si demain il n'y en a que 3 ou 6, ta boucle est fausse. Tant que tu veux parcourir l'intégralité du CSV, c'est une boucle while qu'il te faut. for conviendrait si tu voulais lire au plus (parce qu'on ne fait jamais confiance au client pour commencer) 4 lignes et avais écrit : for ($i = 0; $i < 4 && ($getData = fgetcsv($file, 10000, ',')); $i++)

          PS : == true est implicite, il n'est pas utile de l'écrire

          -
          Edité par julp 18 mai 2021 à 15:13:05

          • Partager sur Facebook
          • Partager sur Twitter
            18 mai 2021 à 15:12:11

            C'est bien ce que je me disais, j'ai eu de la chance, cependant j'avais remplacé mon while par le for afin d'avoir une variable qui s'incrémente (et que je cherchais une solution plus propre que de mettre une variable dans le while). Mais du coup est-ce que comme ça c'est syntaxement correcte (ça fonctionne en tout cas) ?

            for ($i=0; ($getData = fgetcsv($file, 10000, ",")) != false; $i++) {}
            • Partager sur Facebook
            • Partager sur Twitter
              18 mai 2021 à 15:15:05

              Mais l'incrément te sert à quoi ? Parce que tu ne le réutilises pas sur tes codes et s'il ne te sert pas autant faire un simple while.

              • Partager sur Facebook
              • Partager sur Twitter
                18 mai 2021 à 15:16:25

                Je ne m'en sert pas pour l'instant, mais j'en aurai besoin par la suite dans mon projet.
                • Partager sur Facebook
                • Partager sur Twitter
                  18 mai 2021 à 15:22:41

                  Oui là où je voulais en venir c'est quand il y a plus de ligne tu tombes dans le false donc le for se termine car la condition n'est plus valide mais julp à très bien détaillé. 

                  • Partager sur Facebook
                  • Partager sur Twitter
                    18 mai 2021 à 15:25:58

                    Ok ok je vois merci, mais hormis le fait que ce ne soit pas propre, il n'y a pas de raison que ça pose problème ?

                    Et comme j'ai fait juste au-dessus c'est mieux ou ça revient au même ?

                    • Partager sur Facebook
                    • Partager sur Twitter
                      18 mai 2021 à 15:30:37

                      Ca dépend quel est le but de ton incrément. Si c'est uniquement pour connaître le numéro de la ligne que tu es en train de parser, oui (le != false n'est pas plus utile que le == true).

                      A noter que :

                      for ($i=0; $getData = fgetcsv($file, 10000, ","); $i++) {
                          // ...
                      }
                      

                      C'est la même chose que :

                      $i=0;
                      while ($getData = fgetcsv($file, 10000, ",")) {
                          // ...
                          $i++;
                      }
                      

                      (suivant la forme que l'on préfère)

                      -
                      Edité par julp 18 mai 2021 à 15:32:47

                      • Partager sur Facebook
                      • Partager sur Twitter
                        18 mai 2021 à 15:41:14

                        Oui, c'est pour connaitre le n° de la ligne parser et aussi le nombre de ligne traiter. Et oui du coup je préfère le for au while :lol:, merci pour tes explications en tout cas !
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Incompréhension fgetcsv() dans un for

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown