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 :

[PHP][ARRAY] Modifier une tableau d'après les resultats d'une autre table


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Homme Profil pro
    Urbaniste
    Inscrit en
    Décembre 2021
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Décembre 2021
    Messages : 14
    Points : 12
    Points
    12
    Par défaut [PHP][ARRAY] Modifier une tableau d'après les resultats d'une autre table
    Bonjour à tous,

    Je suis bloqué sur un script php comportant deux tables :
    - Un tableau "reponsesUser" me permet d'associer un ID à une valeur 1 ou 0 me permettant de savoir si l'utilisateur a répondu oui ou non à cette réponse :
    array (
    1051 => 1,
    1052 => 0,
    1053 => 0,
    1054 => 1,
    ...)
    - Et un autre tableau multidimensionnel "questionsReponses" qui me permet d'associer les réponses à la question et de lui assigner une valeur particulière :

    20098 => // Question 1
    1051 => 0, // Reponse 1
    1052 => 1 // Reponse 2

    20099 => // Question 2
    1053 => 1, // Reponse 1
    1054 => 2 // Reponse 2
    En gros, je souhaite que dans cette exemple :
    - il cherche s'il y a une valeur == 2 dans le tableau "questionsReponses" (ça j'ai réussi avec array_search)
    - il me retourne la clé principale (là je n'arrive qu'à récupérer la 2ème clé donc 1054)
    - et comme là il trouve une clé "2" dans une des réponses, il modifie toutes les réponses de l'utilisateur liées à la question par une valeur (donc il va modifier la table "reponsesUser" des clés 1053 et 1054 pour les passer à "1".

    Bon, si je ne suis pas clair, ne pas hésiter à me le dire

    Merci par avance à la personne qui prendra le temps de me répondre,
    Bon WE.

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 228
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 228
    Points : 8 487
    Points
    8 487
    Billets dans le blog
    17
    Par défaut
    En effet ce n'est pas clair Et j'ai peur qu'on aille sur un problème XY.

    Tu devrais nous donner le contexte du questionnaire, ce que tu cherches à faire, un extrait de la data en entrée, et la data attendue en sortie.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Urbaniste
    Inscrit en
    Décembre 2021
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Décembre 2021
    Messages : 14
    Points : 12
    Points
    12
    Par défaut
    Bonjour Seb. et merci de ton retour.

    J'ai lu la page WIKIPEDIA et ça ressemble exactement à mon post

    Alors mon 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
    25
    26
    27
    28
    29
    30
     
    // On récupére dans la table reponses_user les reponses de l'utlisateur en cours aux questions   
    $sql = 'SELECT * FROM reponses_user WHERE id_user = "'.$id_utilisateur.'"';
    $req = mysqli_query($conn, $sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysqli_error());
    $data = mysqli_fetch_array($req);
    if (!empty($data['all_values'])) {
        echo "<fieldset><div class='grid flex'>";
        // On supprime le 1er caractère de la chaine ";"
        $string = substr($data['all_values'],1);
        // Puis on sépare les caractères de la chaine pour les mettre dans un tableau
        $array = explode(";", $string);
        $result = Array();
        foreach ($array as $data){
            $temp = explode("r", $data);
            $result[$temp[0]] = $temp[1];
        }
        // On affiche le tableau $result
        var_dump($result);
     
        //On creer une jointure entre les tables 'reponses' et 'questions' pour récupérer toutes les réponses de chaque ITEM
        $sql = "SELECT reponses.id_ai AS reponsesIdAi, questions.id_ai AS questionsIdAi, reponses.value_degradee FROM reponses INNER JOIN questions ON reponses.id_ai_question=questions.id_ai AND questions.id_link_item=5 ORDER BY value_ip2a DESC";
        $req = mysqli_query($conn, $sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysqli_error());
        // On créer le tableau $arrayQuestionsReponses
        $arrayQuestionsReponses = Array();
        // On réalise une boucle pour mettre les résultats dans un tableau avec les réponses associées à leur question
        while ($data = mysqli_fetch_array($req)) {
            $arrayQuestionsReponses[$data['questionsIdAi']][$data['reponsesIdAi']] = $data['value_degradee'];
        }
        // On affiche le tableau $arrayQuesstionsReponses
        var_dump($arrayQuestionsReponses);
    Mon tableau $result qui indique si l'utilisateur a répondu oui ou non à une réponse => la clé associée (XXXX) à la réponse (0 ou 1) est un ID unique lié à une réponse
    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
     
    array (size=48)
      1051 => string '1' (length=1)
      1054 => string '1' (length=1)
      1087 => string '0' (length=1)
      1064 => string '0' (length=1)
      1066 => string '0' (length=1)
      1053 => string '1' (length=1)
      1049 => string '1' (length=1)
      1052 => string '1' (length=1)
      1050 => string '1' (length=1)
      1055 => string '1' (length=1)
      1057 => string '1' (length=1)
      1065 => string '0' (length=1)
      1090 => string '1' (length=1)
      1094 => string '1' (length=1)
      1095 => string '1' (length=1)
      1093 => string '1' (length=1)
      1096 => string '1' (length=1)
      1098 => string '0' (length=1)
      1067 => string '1' (length=1)
      1070 => string '1' (length=1)
      1080 => string '0' (length=1)
      1099 => string '0' (length=1)
      1101 => string '1' (length=1)
      1102 => string '0' (length=1)
      1103 => string '0' (length=1)
      1056 => string '1' (length=1)
      1058 => string '1' (length=1)
      1061 => string '1' (length=1)
      1076 => string '1' (length=1)
      1073 => string '1' (length=1)
      1079 => string '0' (length=1)
      1081 => string '1' (length=1)
      1084 => string '0' (length=1)
      1085 => string '0' (length=1)
      1086 => string '0' (length=1)
      1088 => string '1' (length=1)
      1132 => string '1' (length=1)
      1133 => string '1' (length=1)
      1134 => string '1' (length=1)
      1135 => string '1' (length=1)
      1131 => string '1' (length=1)
      1153 => string '1' (length=1)
      1154 => string '1' (length=1)
      1155 => string '1' (length=1)
      1156 => string '0' (length=1)
      1157 => string '0' (length=1)
      1158 => string '1' (length=1)
      1159 => string '1' (length=1)
    Mon tableau $arrayQuestionsReponses qui va associer toutes les réponses aux questions (les questions et les réponses sont stockées dans deux tables SQL différentes)
    La valeur associée (0, 1 ou 2) à l'ID correspond à une option me permettant de créer des questionnaires personnalisés :
    - 0 = réponse normale
    - 1 = réponse pour laquelle sa valeur est dégradée
    - 2 = réponse "Non concernée" => si l'utilisateur a sélectionné cette réponse, toutes les réponses de l'utilisateur du tableau $result doivent passer à 0

    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
    array (size=13)
        20094 => 
          array (size=3)
            1069 => string '0' (length=1)
            1067 => string '0' (length=1)
            1068 => string '1' (length=1)
        20090 => 
          array (size=4)
            1064 => string '0' (length=1)
            1065 => string '0' (length=1)
            1066 => string '0' (length=1)
            1153 => string '2' (length=1)
        20088 => 
          array (size=3)
            1060 => string '0' (length=1)
            1058 => string '0' (length=1)
            1059 => string '1' (length=1)
        20096 => 
          array (size=3)
            1075 => string '0' (length=1)
            1073 => string '0' (length=1)
            1074 => string '1' (length=1)
        20086 => 
          array (size=4)
            1049 => string '0' (length=1)
            1050 => string '0' (length=1)
            1051 => string '0' (length=1)
            1052 => string '0' (length=1)
        20091 => 
          array (size=3)
            1063 => string '0' (length=1)
            1061 => string '0' (length=1)
            1062 => string '1' (length=1)
        20087 => 
          array (size=5)
            1053 => string '0' (length=1)
            1054 => string '0' (length=1)
            1055 => string '0' (length=1)
            1056 => string '0' (length=1)
            1057 => string '0' (length=1)
        20095 => 
          array (size=3)
            1072 => string '0' (length=1)
            1070 => string '0' (length=1)
            1071 => string '1' (length=1)
        20097 => 
          array (size=3)
            1078 => string '0' (length=1)
            1077 => string '1' (length=1)
            1076 => string '0' (length=1)
        20098 => 
          array (size=3)
            1079 => string '0' (length=1)
            1080 => string '0' (length=1)
            1154 => string '2' (length=1)
        20100 => 
          array (size=3)
            1083 => string '0' (length=1)
            1081 => string '0' (length=1)
            1082 => string '1' (length=1)
        20099 => 
          array (size=5)
            1084 => string '0' (length=1)
            1085 => string '0' (length=1)
            1086 => string '0' (length=1)
            1087 => string '0' (length=1)
            1155 => string '2' (length=1)
        20101 => 
          array (size=2)
            1088 => string '0' (length=1)
            1089 => string '0' (length=1)
    Mon problème aujourd'hui est que je n'arrive pas à récupérer toutes les clés des questions pour lesquelles il y a une valeur option de 2 (donc les clés 20090 20098 et 20099) puis ensuite modifier toutes les clés associées à ces trois questions dans le tableau $result.

    J'espère avoir été un peu plus clair ?

    Merci

  4. #4
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 228
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 228
    Points : 8 487
    Points
    8 487
    Billets dans le blog
    17
    Par défaut
    Je vois mieux, même si je ne comprends pas bien la finalité

    Mon problème aujourd'hui est que je n'arrive pas à récupérer toutes les clés des questions pour lesquelles il y a une valeur option de 2 (donc les clés 20090 20098 et 20099) puis ensuite modifier toutes les clés associées à ces trois questions dans le tableau $result.
    $result est un simple tableau d'ID réponses, tu n'as donc pas besoin de l'ID question de $arrayQuestionsReponses, mais seulement des ID réponses de la question ayant une réponse à 2.

    Tu pourrais faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    foreach ($arrayQuestionsReponses as $question_id => $responses) {
        if (!in_array(2, $responses)) { // Valeur 2 non présente parmi les réponses ?
            continue; // Si 2 non présent, on passe à la question suivante
        }
        // Si on a trouvé une valeur à 2...
        $responses_ids = array_keys($responses); // On récupère les ID réponses de la question courante
        foreach ($responses_ids as $response_id) { // On parcourt ces réponses
            $result[$response_id] = 0; // Et on les passe à 0 dans $result, il faudra peut-être faire un isset()
        }
    }
    N'ayant pas de data à copier/coller je ne peux pas tester ce script, mais tu as au moins l'idée

  5. #5
    Membre à l'essai
    Homme Profil pro
    Urbaniste
    Inscrit en
    Décembre 2021
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Décembre 2021
    Messages : 14
    Points : 12
    Points
    12
    Par défaut
    Avec quelques petites modifications, ça marche à merveille merci Séb. !

    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
     
    foreach ($arrayQuestionsReponses as $question_id => $responses) {
            if (!in_array(2, $responses)) { // Valeur 2 non présente parmi les réponses ?
               continue; // Si 2 non présent, on passe à la question suivante
            }
            var_dump($responses);
            // Si on a trouvé une valeur à 2...
            if (in_array(2, $responses)) {
                $idReponseDegradee = array_search(2, $responses);
                if (isset($result[$idReponseDegradee]) AND $result[$idReponseDegradee] == 1) { // Si l'utilisateur a déjà répondu à une réponse dégradée et que sa valeur est de 1
                    $responses_ids = array_keys($responses); // On récupère les ID réponses de la question courante
                    foreach ($responses_ids as $response_id) { // On parcourt ces réponses
                        $result[$response_id] = 1; // Et on les passe à 0 dans $result
                    }
                }           
            }
        }
    Pour expliquer un peu plus en détail, il s'agit d'un questionnaire pour lequel tu n'as pas de forme type et pour lequel des actions sont associées aux réponses en fonction des valeurs.
    En fonction des réponses, il faut parfois afficher l'action, parfois non ...

    Pourquoi faire simple quand on peut faire compliqué

    Merci encore !

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 30/06/2021, 10h56
  2. [MySQL-5.0] Modifier un champ d'une table d'après le champ d'une autre table
    Par LJubi dans le forum MySQL
    Réponses: 5
    Dernier message: 13/11/2014, 22h49
  3. Modifier une autre table dans un trigger
    Par Mister Nono dans le forum SQL
    Réponses: 4
    Dernier message: 18/09/2007, 12h12
  4. [PHP-JS] Modifier une variable PHP en JavaScript
    Par Prenthès dans le forum Langage
    Réponses: 6
    Dernier message: 17/01/2007, 16h52
  5. récupérer juste les données d'une autre table
    Par rangernoir dans le forum Access
    Réponses: 5
    Dernier message: 13/09/2005, 14h52

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