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 :

Parcours Tableau et calcul


Sujet :

Langage PHP

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Février 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur décisionnel
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2009
    Messages : 140
    Par défaut Parcours Tableau et calcul
    Bonjour tout le monde.

    J'ai un probleme avec un tableau.
    Celui ci contient les données suivantes:

    DEBIT SENS COMPTE
    5 CR 100
    6 DB 100
    4 CR 101
    8 CR 102
    3 CR 102

    En fait je voudrais que, si le compte est le meme d'une ligne sur l'autre (il ne peut se repeter que sur 2 lignes), on additionne les 2 debits et on passe au compte suivant.

    Si le compte n'est pas le meme d'une ligne sur l'autre, alors la pas de problemes

    Pour le moment j'en suis la :
    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
     
    while(list($cle,$val) = each($arrRes)){ // Boucle sur comptes		
        $compte = $val["compte"]; // Compte en cours
        $total = 0;
     
        if ($val["SENS"]=="DB"){
            $total = $val["DEBIT"];
        }
        elseif($val["SENS"]=="CR"){
            $total = -$val["DEBIT"];
        }
     
        next($arrRes);	// On va voir la ligne suivante
     
        if ($val["compte"]==$compte){	// Si à la ligne suivante le compte est le meme que le compte en cours
            if ($val["SENS"]=="DB"){
                $total += $val["DEBIT"];
            }
            elseif($val["SENS"]=="CR"){
                $total -= $val["DEBIT"];
            }
     
        }
        else{	// Sinon on revient en arriere
            prev($arrRes);
        }
        echo $total." €";
    }
    Mais il semblerait que je passe toujours dans le if :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($val["compte"]==$compte){	// Si à la ligne suivante le compte est le meme que le compte en cours
    Je pense qu'il y à un probleme avec next et prev, ca fait bien avancé d'un cran dans le tableau, mais quand je lit la ligne j'ai toujours le même résultat

    Quelqu'un à t'il une idée ?

  2. #2
    Membre Expert Avatar de Amara
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 688
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 688
    Par défaut
    Slt,

    Il doit y avoir un souci d'algo à première vue car dans ta boucle la première chose que tu fais c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $compte = $val["compte"];
    donc forcément un peu plus loin quand tu testes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($val["compte"]==$compte)
    c'est toujours vrai vu que tu as justement initialisé $compte avec $val["compte"] juste avant.

    Je pense que tu te compliques bien la vie pour faire ton truc, quand j'ai besoin de faire ça je stocke dans une variable la valeur du compte précédent (il faut juste que ton tableau soit trié par compte). A chaque tour de boucle tu regardes si le compte courant est le même que celui que le précédent (stockée dans la variable), et on fait les traitements en conséquence.

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Février 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur décisionnel
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2009
    Messages : 140
    Par défaut
    Justement, je prend le compte de la 1ere ligne,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $compte = $val["compte"];
    Puis je vais a la ligne suivante
    Et enfin je teste les 2 comptes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($val["compte"]==$compte)

  4. #4
    Membre Expert Avatar de Amara
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 688
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 688
    Par défaut
    Ok, je comprends mieux.
    Mais tu es sûr qu'en faisant juste next comme ça la valeur de $val va être modifiée ? J'en doute même si je ne connais pas bien next, en lisant la doc je ne suis pas sûr du tout que ça fasse ce que tu attends...

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Février 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur décisionnel
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2009
    Messages : 140
    Par défaut
    Et bien du coup je pense que non ca ne fait pas ce que je souhaite, on se deplace bien mais $val n'est malheureusement pas modifié.
    Je ne connais pas bien les tableaux et du coup je suis un peu bloqué la dessus

  6. #6
    Membre Expert Avatar de Amara
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 688
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 688
    Par défaut
    Tu dois pouvoir recharger $val en utilisant current je pense.
    http://php.net/manual/fr/function.current.php

    Mais bon le bricolage de tableaux comme ça j'ai jamais trop aimé je préfère faire un algo tout classique avec un pauvre foreach parce que là aller un coup en avant revenir un coup en arrière... quand tu arrives au bout il faut quoi d'ailleurs ? Sur le dernier élément quand tu vas faire next ?

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Février 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur décisionnel
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2009
    Messages : 140
    Par défaut
    Ben si tu as un algo meilleur je suis preneur

  8. #8
    Membre confirmé
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Février 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur décisionnel
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2009
    Messages : 140
    Par défaut
    En fait depuis le début j'utilise la méthode que tu préconise, mais je suis obligé d'aller voir la ligne d'apres pour éventuellement récuperer son debit et faire la somme avec le 1er

  9. #9
    Membre Expert Avatar de Amara
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 688
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 688
    Par défaut
    Citation Envoyé par Xenon03 Voir le message
    En fait depuis le début j'utilise la méthode que tu préconise, mais je suis obligé d'aller voir la ligne d'apres pour éventuellement récuperer son debit et faire la somme avec le 1er
    Non tu peux gérer ça dans une variable tampon aussi.

    Truc dans le genre (c'est valable pour X mouvements successifs, pas limité à 2) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    idcompteprec = -1 (un id impossible)
    totaltemp = 0
    TANT QUE elements à traiter FAIRE
       SI idcompte courant = idcompteprec ALORS
          totaltemp = totaltemp + total courant (suivant débit / crédit)
       SINON
          traitement (affichage...) sur idcompteprec et totaltemp
          idcompteprec = idcompte courant
          totaltemp = total courant
       FINSI
    FIN TANT QUE
    Pas de bricolage avec le tableau, on travaille naturellement sur les itérations.

    A peaufiner

  10. #10
    Membre confirmé
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Février 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur décisionnel
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2009
    Messages : 140
    Par défaut
    C'est malheureusement impossible à appliquer pour mon cas

    Peut-être qu'il existe un algo pour modifier ce tableau en amont, pour pouvoir l'afficher facilement par la suite

  11. #11
    Membre Expert Avatar de Amara
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 688
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 688
    Par défaut
    Citation Envoyé par Xenon03 Voir le message
    C'est malheureusement impossible à appliquer pour mon cas
    Bah pourquoi ? Me semble que ça fait exactement ce que tu donnes dans ton premier bout de code, le bricolage des tableaux en moins.
    Quelle est la contrainte qui fait que ça ne colle pas ?

  12. #12
    Membre confirmé
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Février 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur décisionnel
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2009
    Messages : 140
    Par défaut
    L'affichage du total
    C'est complexe a expliquer mais la méthode que tu préconise ne peut fonctionner

    Pour le total, je suis obligé d'aller voir la ligne suivante, de recuperer son debit, puis de l'ajouter au débit en cours ...

  13. #13
    Membre Expert Avatar de Amara
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 688
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 688
    Par défaut
    Citation Envoyé par Xenon03 Voir le message
    L'affichage du total
    C'est complexe a expliquer mais la méthode que tu préconise ne peut fonctionner

    Pour le total, je suis obligé d'aller voir la ligne suivante, de recuperer son debit, puis de l'ajouter au débit en cours ...
    Tu n'as pas compris mon algo alors.
    Tu t'entêtes à faire ton traitement (mise à jour du débit / crédit) sur la première des deux lignes, mais rien ne t'empêche de le faire sur la deuxième étant donné que tu as conservé dans les variables temporaires les valeurs de la ligne précédente, ça revient strictement au même Essaie de vraiment prendre du recul sur l'algo.

  14. #14
    Membre confirmé
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Février 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur décisionnel
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2009
    Messages : 140
    Par défaut
    C'est plutot que je ne maitrise pas assez PHP pour y arriver ^^
    Et les tableaux encore moins

  15. #15
    Membre confirmé
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Février 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur décisionnel
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2009
    Messages : 140
    Par défaut
    Avec ton algo j'avance un peu, je n'ai plus qu'une seule fois chaque compte, mais leur total est faux.

    Mais j'avance

  16. #16
    Membre confirmé
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Février 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur décisionnel
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2009
    Messages : 140
    Par défaut
    J'avance encore un peu :
    Ca marche parfaitement, mais uniquement pour les comptes en double.
    C'est normal avec l'algo mais bon je cherche une astuce.

    En fait ceux qui ne sont pas en double passent directement dans le else malheureusement

    code actuel :
    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
    $cpt =0;
    while(list($cle,$val) = each($arrRes)){ // Boucle sur comptes		
     
        if ($comptePrec == $val["compte"]){
     
            if ($val["SENS"]=="DB"){
                $totalTemp -= $val["DEBIT"];
            }
            elseif($val["SENS"]=="CR"){
                $totalTemp += $val["DEBIT"];
            }
     
            // Puis affichage des infos
        }
        else{
     
            $comptePrec = $val["compte"];
            if ($val["SENS"]=="DB"){
                $totalTemp = -$val["DEBIT"];
            }
            elseif($val["SENS"]=="CR"){
                $totalTemp = $val["DEBIT"];
            }			
     
        }
     
    }	// Fin de la boucle des comptes

  17. #17
    Membre Expert Avatar de Amara
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 688
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 688
    Par défaut
    Je me suis trompé quelque part, à mon avis au début il faut initialiser la valeur de $compteprec avec ton premier compte pour que ça marche, désolé.

    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
     
    $comptePrec = $arrRes[0]["compte"];
    while(list($cle,$val) = each($arrRes)){ // Boucle sur comptes		
     
        if ($comptePrec == $val["compte"]){
     
            if ($val["SENS"]=="DB"){
                $totalTemp -= $val["DEBIT"];
            }
            elseif($val["SENS"]=="CR"){
                $totalTemp += $val["DEBIT"];
            }
        }
        else{
     
            // Affichage des infos de comptePrec et totalTemp
     
            $comptePrec = $val["compte"];
            $totalTemp = 0;
    	if ($val["SENS"]=="DB"){
                $totalTemp -= $val["DEBIT"];
            }
            elseif($val["SENS"]=="CR"){
                $totalTemp += $val["DEBIT"];
            }
        }
     
    }
     
     // Affichage des infos de comptePrec et totalTemp (pour le dernier compte)
    Pour le premier compte : il va mettre à jour le total (comme il était à 0 ça sera bon).
    Pour les comptes suivants : si on est toujours sur le même compte alors on met juste à jour le total, sinon on traite le compte précédent et on met à jour les deux variables temporaires avec les données du compte courant.
    Pour le dernier compte : il faut le traiter en dehors de la boucle.

    Il faut creuser les cas à 0 ou 1 compte.

    A y réfléchir je me suis un peu fourvoyé, ça devrait fonctionner mais je n'avais pas tout à fait le même genre de soucis

Discussions similaires

  1. For Each - parcours tableau
    Par Aizen64 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 04/12/2007, 21h26
  2. [Tableaux] Parcours tableau associatif
    Par damien27000 dans le forum Langage
    Réponses: 2
    Dernier message: 03/10/2007, 15h33
  3. pb parcours tableau 2d
    Par baillador dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 15
    Dernier message: 30/03/2006, 16h20
  4. Réponses: 10
    Dernier message: 19/01/2006, 06h41
  5. Tableau et calculs
    Par isak dans le forum Composants
    Réponses: 1
    Dernier message: 30/06/2005, 10h33

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