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 :

Calcul dans un tableau : ancienne valeur+ nouvelle valeur [PHP 5.4]


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2012
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2012
    Messages : 77
    Points : 85
    Points
    85
    Par défaut Calcul dans un tableau : ancienne valeur+ nouvelle valeur
    Bonjour,

    Pour commencer je construis un tableau multidimensionnel qui se rempli de données en provenance de flux XML, en même temps qu'ils sont parcourus.

    Mon tableau se présente comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $t_references = array
                           (
                              $v_nom_flux => array
                                                     (
                                                        "nb_occurences" => $v_occurences,
                                                        "nb_total_docs" => $v_total_documents
                                                     )
                           );
    Voici mon script:
    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
     
        //Parcours du répertoire
          $v_repertoire = @opendir($v_URL);
          while(FALSE !== $v_fichier = @readdir($v_repertoire)){
            //Stocker le contenu du répertoire dans un tableau
            //Trier le contenu du répertoire dans l'ordre alphabétique
              $t_tri[] = "$v_fichier";
              sort($t_tri);
          }
          foreach($t_tri as $v_fichier){ //Pour chaque flux
            //Tester le rejeux du flux (numéro du flux commence par 0?)
              if(substr("$v_fichier", -5, 1) == 0 && $v_fichier != '.' && $v_fichier != '..'){ //ne faites pas attention à ce contrôle, il est OK
                  $v_chemin = $v_URL_factures.DIRECTORY_SEPARATOR.$v_fichier;
                  $o_xml = simplexml_load_file($v_chemin);
                //extraire le nom complet du flux et le stocker
                  $v_nom_long_flux = $o_xml->FLX_REF;
                //extraire le nombre d'éléments du flux et le stocker
                  $v_nb_docs = $o_xml->NBR_ELT;
                //extraire le nom court du flux et le stocker (retirer les 22 derniers caractères)
                  $v_nom_court_flux = substr("$v_nom_long_flux", 0, -22);
                //Alimenter les variables tableaux
                  $v_nom_flux = "$v_nom_court_flux";
                  $v_nom_complet = "$v_nom_long_flux";
                  $v_nb_elements = $v_nb_docs;
     //Jusqu'ici tout est OK, mais je vous l'ai mis pour que vous ayez une vision globale... au cas où vous en auriez besoin. Et si ça peut aider aussi! =)
     
                //Ajouter le tout premier flux directement dans le tableau vide
                if(key($t_references)== NULL ){
                     $v_total_documents = $v_nb_docs;
                     $v_ajout = array
                     (
                        "nb_occurences" => 1, //il apparait donc une fois
                        "nb_total_docs" => $v_total_documents
                     );
                     $t_references["$v_nom_flux"]=$v_ajout;
                 }else{
                     $v_index = key($t_references);
                     while($v_nom_flux = current($t_references)){
                       //Si le nom est déjà présent dans le tableau : modification
                         if(strcasecmp($v_index, $v_nom_court_flux) == 0){
                             $v_occurences = $v_occurences + 1;
                             $v_total_documents = $v_total_documents + $v_nb_docs;
                           //modifier un flux de données dans le tableau
                             $v_modification = array
                                                (
                                                    "nb_occurences" => $v_occurences,
                                                    "nb_total_docs" => $v_total_documents
                                                );
                             $t_references[key($t_references)] = $v_modification;
                             break;
                       //Si le nom n'est pas présent dans le tableau : ajout
                         }else{
                             $v_compteur++;
                             next($t_references);
                         }
                     }
                   //Traitement si le nom pas présent dans le tableau
                     If($v_compteur > 0){
                        $v_nom_flux = $v_nom_court_flux;
                        $v_total_documents = $v_nb_docs;
                      //ajouter le flux de données à la fin du tableau de références
                        $v_ajout = array
                                     (
                                        "nb_occurences" => 1,
                                        "nb_total_docs" => $v_total_documents
                                     );
                         $t_references["$v_nom_flux"]=$v_ajout;
                     }
                 }
                  //stocker tous les flux rencontrés
                    $v_ajout = array
                                (
                                    "nb_elements" => $v_nb_elements
                                );
                    $t_details["$v_nom_complet"] = $v_ajout;
     
              }
          }
    echo "Données agrégées : <br/>";
    var_dump($t_references);
    echo "<br/> Détails : <br/>";
    var_dump($t_details);
    Pour précision : le tableau t_details reprend l'ensemble des flux avec leur nom et la quantité de documents contenus,
    et le tableau t_references regroupe les informations pour chaque type de flux

    Voici ce que ce script me donne comme résultat:
    Données agrégées :
    array(3) { ["fichier_type1"]=> array(2) { ["nb_occurences"]=> int(2) ["nb_total_docs"]=> int(7566) } ["fichier_type2"]=> array(2) { ["nb_occurences"]=> int(1) ["nb_total_docs"]=> object(SimpleXMLElement)#94 (1) { [0]=> string(4) "1436" } } ["fichier_type3"]=> array(2) { ["nb_occurences"]=> int(1) ["nb_total_docs"]=> object(SimpleXMLElement)#1 (1) { [0]=> string(4) "2360" } } } //devrait être égal à 12310

    Détails :
    array(6) { ["fichier_type1_00001"]=> array(1) { ["nb_elements"]=> object(SimpleXMLElement)#98 (1) { [0]=> string(4) "4995" } } ["fichier_type1_00002"]=> array(1) { ["nb_elements"]=> object(SimpleXMLElement)#97 (1) { [0]=> string(4) "2571" } } ["fichier_type2_00001"]=> array(1) { ["nb_elements"]=> object(SimpleXMLElement)#94 (1) { [0]=> string(4) "1436" } } ["fichier_type3_00001"]=> array(1) { ["nb_elements"]=> object(SimpleXMLElement)#89 (1) { [0]=> string(4) "4991" } } ["fichier_type3_00002"]=> array(1) { ["nb_elements"]=> object(SimpleXMLElement)#90 (1) { [0]=> string(4) "4959" } } ["fichier_type3_00003"]=> array(1) { ["nb_elements"]=> object(SimpleXMLElement)#1 (1) { [0]=> string(4) "2360" } } }
    Donc en gros il me fait bien le calcul une fois quand le flux existe déjà, puis pour les suivants, il écrase les données... en tout cas je le comprends comme ça. Mais je ne vois pas trop ce qui pêche dans mon script...

  2. #2
    Membre régulier
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2012
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2012
    Messages : 77
    Points : 85
    Points
    85
    Par défaut
    Je n'ai toujours pas trouvée de solution mais un nouveau problème s'ajoute à ma liste!
    Une fois tous les fichiers XML parcourus et donc mon tableau complété, j'exporte ces données dans un fichier Excel via PHPExcel writer. J'ai déjà des problèmes de mémoire dont j'avais fait part sur ce forum, mais là j'ai carrément une alerte windows
    The instruction at "0x00c71b61" referenced memory at "0xd10fb231". The me mory could not be "read"
    J'ai trouvé quelques infos sur le net, mais uniquement en anglais. Et comme la mémoire est un sujet que je ne maîtrise absolument pas, j'ai du mal à comprendre ce qui se passe... si quelqu'un pouvait prendre le temps de m'expliquer. Merci.

  3. #3
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    j'essaye de comprendre ce que tu cherches à faire mais je n'y arrive pas avec ton code
    Bon je me suis cassé quelques neurones en jouant aux devinettes :
    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
    <?php
     
        //Parcours du répertoire
        $v_repertoire = @opendir($v_URL);
        while(($v_fichier = @readdir($v_repertoire)) !== false) {
            $t_tri[] = $v_fichier;
        }
        sort($t_tri);
     
        $t_references = array();
        $t_details    = array();
     
        foreach($t_tri as $v_fichier) {
            if (substr($v_fichier, -5, 1) == 0 && $v_fichier !== '.' && $v_fichier !== '..') {
                $v_chemin         = $v_URL_factures.DIRECTORY_SEPARATOR.$v_fichier;
                $o_xml            = simplexml_load_file($v_chemin);
                $v_nom_long_flux  = (string)$o_xml->FLX_REF;
                $v_nb_docs        = (string)$o_xml->NBR_ELT;
                $v_nom_court_flux = substr($v_nom_long_flux, 0, -22);
     
                // Ajouter le tout premier flux directement dans le tableau vide
                if (empty($t_references[$v_nom_court_flux])) {
                    $t_references[$v_nom_court_flux] = array(
                        'nb_occurences' => 1,
                        'nb_total_docs' => $v_nb_docs
                    );
                }
                else {
                    ++$t_references[$v_nom_court_flux]['nb_occurences'];
                    $t_references[$v_nom_court_flux]['nb_total_docs'] += $v_nb_docs;
                }
     
                $t_details[$v_nom_long_flux] = array(
                    'nb_elements' => $v_nb_docs
                );
            }
        }
        echo "Données agrégées : <br/>";
        var_dump($t_references);
        echo "<br/> Détails : <br/>";
        var_dump($t_details);
    allez je croise les doigts

  4. #4
    Membre régulier
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2012
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2012
    Messages : 77
    Points : 85
    Points
    85
    Par défaut
    A priori tu as tout à fait compris ma demande! =)
    Je m'excuse, j'avais fini par trouvé la solution par moi même mais je dois dire que ton code est mille fois plus propre que le mien! J'ai encore beaucoup à apprendre! Et je vais d'ailleurs reprendre ma solution!!
    Merci bien en tout cas!

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

Discussions similaires

  1. ajouter une ligne dans un tableau et afficher la valeur d'une variable
    Par dede94 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 03/05/2010, 17h24
  2. [Forms 6i] Ancienne et nouvelle valeur de l'item
    Par macben dans le forum Forms
    Réponses: 2
    Dernier message: 02/03/2009, 14h18
  3. ancienne et nouvelle valeur dans une liste deroulante
    Par jejeman dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 10/11/2006, 16h06
  4. [VBA] Obtenir l'index dans un tableau à partir de sa valeur.
    Par Julien Dufour dans le forum Access
    Réponses: 2
    Dernier message: 28/07/2006, 11h03
  5. Réponses: 2
    Dernier message: 07/06/2006, 08h42

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