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 :

[Tableaux] Comparaison de valeurs dans deux lignes d'un tableau indexé par php


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 22
    Points : 16
    Points
    16
    Par défaut [Tableaux] Comparaison de valeurs dans deux lignes d'un tableau indexé par php
    Bonjour
    Auparavant merci à ceux qui m'ont aidé dans mon précédent post. Je souhaiterais connaitre un script qui me permettrait de comparer deux lignes d'un tableau indexé. Je n'arrive pas à trouver la syntaxe pour définir la variable temporaire ex tableau[indice].valeur champ, tableau[indice-1].valeur champ Ledit tableau a déja été créé à partir d'une table MySql avec mysql_fetch_assoc. Peux t'on décemment utiliser l'indice créé avec cette fonction pour comparer deux lignes d'un tableau? Merci d'avance de votre réponse.

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 232
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 232
    Points : 15 525
    Points
    15 525
    Par défaut
    la fonction "mysql_fetch_assoc" utilise le nom du champ comme clé.
    après ça dépend de la façon tu construit ton tableau

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 22
    Points : 16
    Points
    16
    Par défaut
    Comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $result = mysql_query($sql);
    $tableau_id = 0 ;
    while ($row = mysql_fetch_assoc($result)) {
       echo $tableau_id++ ;   
       echo $row["champ a comparer"];
    }
    L'index est créé avec une valeur incrémentée par tableau_id++ ;
    A++;

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 22
    Points : 16
    Points
    16
    Par défaut
    Ceci donne un index pour chaque enregistrement dans le tableau

  5. #5
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 232
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 232
    Points : 15 525
    Points
    15 525
    Par défaut
    je ne vois pas ce que tu cherches à faire, est ce que tu pourrais nous donner plus de détails : à quoi correspondent les données ? tu veux comparer quoi ?

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 22
    Points : 16
    Points
    16
    Par défaut
    Bonjour
    La table MySql comporte des données classées groupées selon un critère la requête sql d'interrogation peut avoir une clause "group by"
    Au résultat devient un tableau restitué avec un index pour une ligne créée pour chaque enregistrement de la table
    le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $result = mysql_query($sql); 
    $tableau_id = 0 ; 
    while ($row = mysql_fetch_assoc($result)) 
    {  
    echo $tableau_id++ ; 
    echo $row["champ a comparer"]; 
    }
    Le tableau devient en qulque sorte si l'on faisait un retour à la ligne à chaque enregistrement, pour plus de lisibilité

    Tableau
    ########################################
    index valeur des données
    0 enregistrement1 avec valeur du critère=A
    1 enregistrement1 avec valeur du critère=A
    2 enregistrement1 avec valeur du critère=A
    3 enregistrement1 avec valeur du critère=A
    4 enregistrement1 avec valeur du critère=A
    5 enregistrement1 avec valeur du critère=A
    6 enregistrement1 avec valeur du critère=A
    7 enregistrement1 avec valeur du critère=B
    8 enregistrement1 avec valeur du critère=B
    #########################################
    Ce que je cherche à faire c'est ceci pendant la boucle while
    si enregistrement à l'indice [ i ] <> enregistrement à l'indice [ i - 1 ]
    en fait comparer la valeur de l'enregistrement courant pendant le parcours du tableau avec le précédent en cas de divergence (si
    par exemple valeur du critère [à l'indice 7]<>valeur du critère [à l'indice 6] donc "A"<>"B", on affiche une ligne et un retour à la ligne
    alors afficher "<hr><br> "
    sinon on continue a afficher les données normalement avec le script du haut

    Je me demande alors s'il faut une boucle for imbriquée utilisant l'index créé avec $tableau_id (c'est d'ailleurs la finalité de cette variable) ou si simplement while suffit.
    Je pense qu'il faudra deux variables temporaires pour comparer les valeurs enregistrement à l'indice [ i ] et enregistrement à l'indice [ i - 1 ].
    J'ai aussi un script avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     while($array=mysql_fetch_array($result))
    Est -ce mieux?
    Merci d'avance.

  7. #7
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Tu peux récupérer d'un côté la clé, de l'autre, la valeur.
    Et ainsi, en faisant un biffer de tes valeurs, comparer les valeurs à l'occurence suivante.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    while(list ($key, $val) = each (mysql_fetch_assoc($result))) {
    // comparaison $val <=> $tmp_val et $key <=> $tmp_key
    // traitement
    $tmp_key = $key;
    $tmp_val = $val;
    }
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 22
    Points : 16
    Points
    16
    Par défaut
    Bonjour JML Merci de ta réponse je pense qu'elle va m'être utile. Cependant peux tu me dire plus précisément ce que fait:

    - la ligne $val <=> $tmp_val et $key <=> $tmp_key

    // traitement

    - et celles ci?

    $tmp_key = $key;
    $tmp_val = $val;

    Une page web en parle t'elle?
    Merci d'avance

  9. #9
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Citation Envoyé par adapter
    Bonjour JML Merci de ta réponse je pense qu'elle va m'être utile. Cependant peux tu me dire plus précisément ce que fait:

    - la ligne $val <=> $tmp_val et $key <=> $tmp_key
    Ce n'est pas du php, mais plutôt une description du test

    - et celles ci?

    $tmp_key = $key;
    $tmp_val = $val;

    Une page web en parle t'elle?
    Merci d'avance
    Je stocke les valeurs dans des variables "buffer" pour les comparer lors de l'occurence suivante.

    Voici un petit squelette d'une telle comparaison

    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
     
    // initialisation des variables buffer
    $tmp_cle = "";
    $tmp_valeur = "";
     
    while (list($cle, $valeur) = each $tableau) {
     
        // comparaison avec les valeurs de l'occurence précédente
        if ($cle == $tmp_cle) echo "la cle est la même";
        if ($valeur == $tmp_valeur) echo "la valeur est la même";
     
        // stockage des valeurs présentes pour comparer aux suivantes
        $tmp_cle = $cle;
        $tmp_valeur = $valeur;
    }
    Voilà, c'est l'esprit d'une comparaison dans un fichier séquentiel correctement trié.
    Bien sûr, tu dois l'adapter à tes besoins.
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 22
    Points : 16
    Points
    16
    Par défaut
    Bonjour Je te remercie de ton aide: je parviens à obtenir quelque chose qui se rapproche de ce que je voulais
    avec ceci
    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
    $sql = "SELECT catégorie FROM pages ORDER BY 1";
    $result = mysql_query($sql);
    $tmp_cle = "";
    $tmp_valeur = "";
     
    while (list($cle, $valeur) = each (mysql_fetch_assoc($result)))
    {
        echo $cle ;
        echo $valeur ;
        echo "<br>";
     
        ##### comparaison avec les valeurs de l'occurence précédente
        if ($valeur != $tmp_valeur) {
            echo "<br><hr><br>";
        }
     
        ##### stockage des valeurs présentes pour comparer aux suivantes
        $tmp_cle = $cle;
        $tmp_valeur = $valeur;
    }
    Cependant quelques soucis

    1èremement
    Les groupes sont affichés séparés par des <hr> comme je le souhaitais mais le dernier élément de chacun d'eux n'en fait pas partie

    cela donne ceci:

    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     Catégorie A
    Catégorie A
    Catégorie A
    Catégorie B
    _____________
    
    Catégorie B
    Catégorie B
    Catégorie C

    Cela doir venir de ma rédaction perso

    2èmement:
    Il y a un message d'erreur en bas de la page
    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
     Warning: Variable passed to each() is not an array or object in /www/hebergeur/adressesite/script.php on line 10
    La ligne en question est justement celle ci

    while (list($cle, $valeur) = each (mysql_fetch_assoc($result))){

    Que faudrait'il faire alors? Merci d'avance à tous

  11. #11
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Tu dois mettre le <hr /> avant le echo.
    Avec un test de $tmp_cle != "" pour ne pas afficher au premier passage.

    Pour la deuxième partie, je verrais plus tard, je ne fais qu'un passage éclair...
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

Discussions similaires

  1. [XL-2010] Comparer des valeurs dans deux colonnes, repérer des lignes, pourcentage
    Par vwtroudy dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 23/06/2015, 09h38
  2. Réponses: 2
    Dernier message: 20/10/2008, 09h24
  3. Réponses: 4
    Dernier message: 23/04/2008, 17h03
  4. Comparaison de valeurs dans deux Hash
    Par KuK dans le forum Langage
    Réponses: 2
    Dernier message: 10/04/2008, 22h41
  5. [Tableaux]Ajouter des valeurs dans un tableau
    Par Antoine1183 dans le forum Collection et Stream
    Réponses: 13
    Dernier message: 03/04/2005, 13h41

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