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 for sur des données extraites d'un fichier xml [PHP 5.6]


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2017
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2017
    Messages : 26
    Points : 18
    Points
    18
    Par défaut boucle for sur des données extraites d'un fichier xml
    Bonjour,

    Je souhaite récupérer des données provenant d'un fichier xml qui contient par exemple 3 fois la donnée Date_de_création et l'afficher dans un fichier excel.

    En effet pour parcourir le fichier xml j'utilise la boucle for mais le pb c'est que j'obtiens plusieurs fois la dernière donnée du fichier (ex fois la donnée 2017-05-16) et non la totalité des différentes données. Pouvez-vous m'aidez svp?

    Merci d'avance

    Voici une partie de mon code php:

    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
    35
    36
    37
    38
    for ($col = 2; $col != $A+2; $col++) 
    {
        foreach($offer as $catLv2)
        {
            foreach($catLv2->Informations as $sscatLv2)
            {
                $createTime = $sscatLv2->{"Date_de_création"};
                $objPHPExcel->setActiveSheetIndex(0)
                    ->setCellValue('A'.$col, $createTime);
            }
        }
    }
    
    xml:
    <offer>
    <Informations>
          <ID>206</ID>
          <Date_de_création>2017-05-11</Date_de_création>
          <Code>250</Code>
              ....
        </Informations>
    <offer>
    <offer>
    <Informations>
          <ID>206</ID>
          <Date_de_création>2017-05-12</Date_de_création>
          <Code>251</Code>
              ....
        </Informations>
    <offer>
    <offer>
    <Informations>
          <ID>206</ID>
          <Date_de_création>2017-05-16</Date_de_création>
          <Code>345</Code>
              ....
        </Informations>
    <offer>

  2. #2
    Membre éprouvé Avatar de Willy_k
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2011
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 540
    Points : 1 067
    Points
    1 067
    Par défaut
    Salut,
    peut-être montrer aussi la partie code où commence l'exploitation du fichier xml jusqu'aux boucles en question? On ne sait pas par exemple d'où la variable $A de $A+2 sort.
    Et le xml donné comme ça semble invalide.
    PS: Vous pouvez utiliser le # de l'éditeur et mettre le code à l'intérieur.
    Le bienfait n'est jamais perdu

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2017
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2017
    Messages : 26
    Points : 18
    Points
    18
    Par défaut
    Merci Willy_k pour votre aide, voici le code:

    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
     
    <?php
    $objPHPExcel = new PHPExcel();
    $fichier = 'fichier_global_offer.xml';
    $xml              = simplexml_load_file($fichier);
    $campaign         = $xml->Niv0_Campagne;
    $operation        = $xml->Niv1_Operation;
    $offer            = $xml->Niv2_Offre;
     
    $A=$xml->ID;
     
    for ($col = 2; $col != $A+2; $col++) 
    {
        foreach($offer as $catLv2)
        {
            foreach($catLv2->Informations as $sscatLv2)
            {
                $createTime = $sscatLv2->{"Date_de_création"};
                $objPHPExcel->setActiveSheetIndex(0)
                    ->setCellValue('A'.$col, $createTime);
            }
        }
    }
    ?>

  4. #4
    Membre éprouvé Avatar de Willy_k
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2011
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 540
    Points : 1 067
    Points
    1 067
    Par défaut
    Votre condition $c != $A + 2 pose déjà un problème, la boucle for sera exécuté 206 fois (si je ne me trompes pas), $A étant = 206, je ne pense pas que ça soit voulu. Pouvez attacher le fichier xml en question si possible. Il serait intéressant de passer par xpath http://php.net/manual/fr/simplexmlelement.xpath.php, cela aura pour effet de réduire les boucles à une seule.
    Le bienfait n'est jamais perdu

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2017
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2017
    Messages : 26
    Points : 18
    Points
    18
    Par défaut
    En effet la boucle se base sur le nombre présent dans ID qui peut varier. Ainsi selon le nombre présent dans le champ ID, j'ai bien le nombre de boucle effectué. Le pb ne vient pas de là mais plus du résultat obtenu à chaque boucle. En effet à chaque boucle cela m'affiche le résultat du dernier champ Date_de_création au lieu de m'afficher le résultat selon la valeur de $col:

    Merci pour votre aide Willy_k


    voici un exemple de fichier xml avec un ID=2 par exemple
    :
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
     
    <?xml version="1.0" encoding="utf-8"?>
    <xmlGlobal>
      <Niv0_Campagne>
        <Nom_campagne>Test ABE </Nom_campagne>
        <Code_campagne>455</Code_campagne>
      </Niv0_Campagne>
      <Niv1_Operation>
        <Nom_operation>opération "Week" </Nom_operation>
        <Code_operation>456</Code_operation>
      </Niv1_Operation>
      <Niv2_Offre>
        <Code>
          <Code_Niv0>455</Code_Niv0>
          <Code_Niv1>456</Code_Niv1>
          <Code_Niv2>457</Code_Niv2>
        </Code>
        <Informations>
          <ID>1</ID>
          <Date_de_création>2017-06-01 10:30:51</Date_de_création>
          <Code>457</Code>
          <Compteur>0</Compteur>
          <Designation>Offre 'cible white - opération</Designation>
          <Benefice_client>0</Benefice_client>
          <Createur_offre>30</Createur_offre>
          <Statut>active</Statut>
          <Priorité>100_Operations_cumulables_niveau_1</Priorité>
        </Informations>
        <Critères>
          <Transaction>0</Transaction>
          <Modulo>0</Modulo>
          <Client>0</Client>
        </Critères>
        <Actions>
          <Type_de_remise>0</Type_de_remise>
        </Actions>
      </Niv2_Offre>
      <Niv0_Campagne>
        <Nom_campagne>TEST ABE</Nom_campagne>
        <Code_campagne>2020</Code_campagne>
      </Niv0_Campagne>
      <Niv1_Operation>
        <Nom_operation>TEST 2 ABE</Nom_operation>
        <Code_operation>2021</Code_operation>
      </Niv1_Operation>
      <Niv2_Offre>
        <Code>
          <Code_Niv0>2020</Code_Niv0>
          <Code_Niv1>2021</Code_Niv1>
          <Code_Niv2>2022</Code_Niv2>
        </Code>
        <Informations>
          <ID>2</ID>
          <Date_de_création>2017-06-09 16:02:34</Date_de_création>
          <Code>2022</Code>
          <Compteur>0</Compteur>
          <Designation>TEST 3 ABE</Designation>
          <Benefice_client>0</Benefice_client>
          <Createur_offre>3</Createur_offre>
          <Financement>1</Financement>
          <Objectif_de_CA>objs sales</Objectif_de_CA>
          <Statut>inprogress</Statut>
          <Priorité>Cumulable - Prix bruts</Priorité>
        </Informations>
        <Critères>
          <Transaction>0</Transaction>
          <Modulo>0</Modulo>
          <Client>0</Client>
          <Date_de_debut>2017-06-09</Date_de_debut>
          <Date_de_fin>2017-06-16</Date_de_fin>
          <Articles_impactes_declencheur>1635</Articles_impactes_declencheur>
          <Articles_impactes_declencheur>2581</Articles_impactes_declencheur>
          <Articles_impactes_declencheur>4666</Articles_impactes_declencheur>
          <Magasins_concernes>30280</Magasins_concernes>
          <Magasins_concernes>30160</Magasins_concernes>
          <Perimetre>Sélection de magasin</Perimetre>
        </Critères>
        <Actions>
          <Type_de_remise>0</Type_de_remise>
          <Message>ligne1</Message>
          <Message_deux>ligne2</Message_deux>
        </Actions>
      </Niv2_Offre>
      <ID>2</ID>
    </xmlGlobal>

  6. #6
    Membre éprouvé Avatar de Willy_k
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2011
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 540
    Points : 1 067
    Points
    1 067
    Par défaut
    J'ai fait un test
    Votre double boucle foreach pose visiblement problème. Essayez en mettant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    echo $col, ' : ', $createTime, '<br>';
    dans votre 2ème boucle foreach, juste après $createTime = $sscatLv2->{"Date_de_création"};, vous verrez pourquoi vous conservez toujours la dernière valeur. Par exemple à la première itération $col = 2, nous avons 2 noeuds "Niv2_Offre" , donc la cellule A2 prend pour la première fois 2017-06-01 10:30:51, et la 2ème fois 2017-06-09 16:02:34 qui écrase la précédente, voici en gros ce qui se passe à chaque for (j'espère que je n'ai pas été flou).
    Bref, voici ce que je propose, je ne vais pas prendre l'ID comme référence, à vous de voir si vous avez le résultat escompté, ou si vous pouvez vous en inspirer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // le 1er slash représente le document, le 2ème xmlGlobal et à partir de on choisit tous les noeuds Niv2_offre ainsi que leur noeud enfant Informations
    $informations = $xml->xpath('//Niv2_Offre/Informations');
    $col = 2;
    foreach ($informations as $information) {
        $creationTime = $information->{"Date_de_création"};
        $objPHPExcel->setActiveSheetIndex(0)
                    ->setCellValue('A'.$col, $createTime);
        $col++;
    }
    Le bienfait n'est jamais perdu

  7. #7
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2017
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2017
    Messages : 26
    Points : 18
    Points
    18
    Par défaut
    Oui j'ai u tester et cela fonctionne bien en effet.
    Merci beaucoup Willy_k pour votre dispo et votre aide.

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

Discussions similaires

  1. [CS3] Faire une boucle for sur des champs texte
    Par Bubuk dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 18/12/2013, 17h06
  2. Boucle for sur des Slides
    Par nsr88 dans le forum VBA PowerPoint
    Réponses: 3
    Dernier message: 07/11/2013, 14h36
  3. Syntaxe pour une boucle for sur des combobox
    Par Tifriis dans le forum VBA Access
    Réponses: 3
    Dernier message: 20/10/2010, 13h52
  4. [BASH] boucle for sur des fichiers, recuperation du chemin ?
    Par zevince dans le forum Shell et commandes GNU
    Réponses: 13
    Dernier message: 13/11/2007, 10h47
  5. [Eval] Problème de boucle for sur des tableaux
    Par battle_benny dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 12/01/2006, 23h55

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