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 :

formulaire de recherche avec données Json. Afficher une liste en fonction du critère recherché


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2019
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2019
    Messages : 12
    Par défaut formulaire de recherche avec données Json. Afficher une liste en fonction du critère recherché
    Bonjour à toutes et à tous!

    Je vous sollicite aujourd'hui pour m'aider à débloquer une situation pour laquelle je fais des recherches depuis un certains temps maintenant. Je pense qu'il s'agit d'une question de logique qui me fait défaut, mais j'aimerai avoir votre avis et vos connaissances sur la question.

    Voila, je travaille sur la création d'un formulaire de recherche qui pourra afficher une liste en fonction du critère recherché. Dans ce cas, il s'agit d'afficher une liste de Pokémon en fonction du type. Pour ce faire, je dois utilisé le langage Php.

    Les données sont stockés dans 2 fichiers Json, l'un avec tous les Pokémon et leurs caractéristiques(dont le type pour chacun); et l'autre avec les différents types.

    J'ai réussi à extraire les données json avec la fonction json_decode() et à isoler les types. L'idée étant de les comparer, et s'il y a une similitude alors afficher les Pokémon correspondant sous forme de tableau html bootstrap.

    Ma logique ne me fait pas emprunter le bon chemin je pense ...

    Voici mon code (P.S.: les commentaires sont des tentatives pour trouver une solution):

    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
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
     
    <?php
     
    $typesJson = file_get_contents("types.json");
    $tableauTypes = json_decode($typesJson, true);
    //var_dump($tableauTypes);
     
    $pokedexJson = file_get_contents("pokedex.json");
    $tableauPokedex = json_decode($pokedexJson, true);
    //var_dump($tableauPokedex);
     
    foreach ($tableauPokedex as $key => $value) {
     
        //echo '<pre>'.print_r($value['type']).'</pre>';
        foreach ($value['type'] as $key1 => $value1) {
            //echo '<pre>'.$key1.':'. ' '. $value1.'</pre>';
        }
    }
     
    // $result = array_intersect($tableauTypes, $tableauPokedex);
    // echo '<pre';
    // echo print_r($result);
    // echo '</pre>';
     
    // $new_array = array();
     
    // foreach ($tableauPokedex as $item) {
    //     array_push($new_array, array('type' => $item['type']));
    // }
    // var_dump($new_array);
    // foreach ($new_array as $key => $value) {
    //     //echo $value;
    //     foreach ($value as $key1 => $value1) {
    //         //echo $value1;
    //         foreach ($value1 as $key2 => $value2) {
    //             echo $value2;
     
    //         }
    //     }
    // }
     
     
    // var_dump($tableauTypes);
     
    ?>
     
    <!DOCTYPE html>
    <html>
     
    <head>
        <meta charset="utf-8">
        <title>Liste des pokémons grâce à un formulaire</title>
        <meta name="author" content="">
        <meta name="description" content="">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.3/css/bootstrap-reboot.min.css" integrity="sha512-YmRhY1UctqTkuyEizDjgJcnn0Knu5tdpv09KUI003L5tjfn2YGxhujqXEFE7fqFgRlqU/jeTI+K7fFurBnRAhg==" crossorigin="anonymous" />
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.3/css/bootstrap-grid.min.css" integrity="sha512-QTQigm89ZvHzwoJ/NgJPghQPegLIwnXuOXWEdAjjOvpE9uaBGeI05+auj0RjYVr86gtMaBJRKi8hWZVsrVe/Ug==" crossorigin="anonymous" />
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.3/css/bootstrap.min.css" integrity="sha512-oc9+XSs1H243/FRN9Rw62Fn8EtxjEYWHXRvjS43YtueEewbS6ObfXcJNyohjHqVKFPoXXUxwc+q1K7Dee6vv9g==" crossorigin="anonymous" />
    </head>
     
    <body>
        <div class="container">
     
            <div class="row">
                <div class="col-12">
     
     
                    <form method="POST" action="">
     
                        <div class="mb-3">
     
                            <select name="typesSelect" class="form-select form-control" aria-label="Default select example">
                                <?php
     
                                foreach ($tableauTypes as $key => $value) {
     
                                    echo '<option name="toutLesTypes" value="' . $value['french'] . '">' . $value['french'] . '</option>';
                                }
     
                                ?>
                            </select>
     
                        </div>
     
                        <div>
     
                            <input class="btn-outline-success btn btn-lg" type="submit" name="validate" value="Valider">
     
                        </div>
     
                    </form>
     
                </div>
            </div>
     
            <?php
     
            if(isset($_POST['validate'])) {
     
                foreach ($tableauPokedex as $key => $value) {
     
                    //echo '<pre>'.print_r($value['type']).'</pre>';
                    foreach ($value['type'] as $key1 => $value1) {
                        //echo '<pre>' . $key1 . ':' . ' ' . $value1 . '</pre>';
                    }
                }
     
                $result = array_intersect($tableauTypes, $value['type']);
                echo '<pre';
                echo $result;
                echo '</pre>';
     
                if (isset($_POST['typesSelect']) == $value1 ) {
     
                    echo '<div class="row">
                        <div class="col-12">
     
                            <table class="table">
                                <thead>
                                    <tr>
                                        <td>#</td>
                                        <td>Image</td>
                                        <td>Nom</td>
                                        <td>Types</td>
                                    </tr>
                                </thead>
                                <tbody>';
     
                                $num = 1;
                                for ($i = 0; $i < count($tableauPokedex); $i++) {
                                        echo '<tr>';
                                        echo '<td>' . $tableauPokedex[$i]['id'] . '</td>';
     
                                        $image = sprintf("%'.03d\n", $num);
                                        echo '<td><img width="50" src="./thumbnails/' . $image . '.png"></td>';
                                        $num++;
     
                                        echo '<td>' . $tableauPokedex[$i]['name']['french'] . '</td>';
                                        echo '<td>';
     
     
                                        echo    '</td>';
                                        echo '</tr>';
                                    }
                            '</tbody>
                        </table>
     
                    </div>
     
                </div>';
                }
            }           
            ?>
        </div>
    </body>
     
    </html>
    Un extrait du Json Pokedex (environ 150 id):

    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
     
    [{
        "id": 1,
        "name": {
          "english": "Bulbasaur",
          "japanese": "フシギダネ",
          "chinese": "妙蛙种子",
          "french": "Bulbizarre"
        },
        "type": [
          "Plante",
          "Poison"
        ],
        "base": {
          "HP": 45,
          "Attack": 49,
          "Defense": 49,
          "Sp. Attack": 65,
          "Sp. Defense": 65,
          "Speed": 45
        }
      },
      {
        "id": 2,
        "name": {
          "english": "Ivysaur",
          "japanese": "フシギソウ",
          "chinese": "妙蛙草",
          "french": "Herbizarre"
        },
        "type": [
          "Plante",
          "Poison"
        ],
        "base": {
          "HP": 60,
          "Attack": 62,
          "Defense": 63,
          "Sp. Attack": 80,
          "Sp. Defense": 80,
          "Speed": 60
        }
      },
    Un extrait du json Types :

    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
     
    [
      {
        "english": "Normal",
        "chinese": "一般",
        "japanese": "ノーマル",
        "french": "Normal"
      },
      {
        "english": "Fighting",
        "chinese": "格斗",
        "japanese": "かくとう",
        "french": "Combat"
      },
      {
        "english": "Flying",
        "chinese": "飞行",
        "japanese": "ひこう",
        "french": "Vol"
      },
      {
        "english": "Poison",
        "chinese": "毒",
        "japanese": "どく",
        "french": "Poison"
      },
    Si vous aviez des pistes pour m'aider à débloquer la situation, je vous dirais milles merci.

    Bonne journée à vous !

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 719
    Par défaut
    vous êtes proche du résultat, il vous manque juste la logique qui permet de dire si un pokemon donné fait partie de la liste à afficher ou non.
    pour faire cela je vous conseille de faire 2 parties :
    - dans la 1re partie, vous parcourez la liste de tous les pokemons avec la boucle foreach. si le pokemon correspond, vous stockez la clé dans une liste
    - dans la 2e partie, vous faites l'affichage des pokemons gardés

    pour savoir si le pokemon est choisi, vous pouvez utiliser la fonction in_array :
    https://www.php.net/manual/fr/function.in-array.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (in_array($_POST['typesSelect'], $pokemon["type"])) {
        $liste_cles[] = $key1;
    }

  3. #3
    Membre averti
    Femme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2019
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2019
    Messages : 12
    Par défaut
    Bonjour Mathieu.

    Merci beaucoup pour votre intervention. Je comprend votre logique simplement j'ai du mal à isoler la value ['type'] pour ensuite la comparer dans la fonction in_array().
    Le parcours des tableaux est en cours d'apprentissage pour moi.

    Il y a cependant un point que je ne comprend pas : je stock la clé dans une liste ok mais comment je fais l'affichage à partir de celle-ci ?

    Voici ce que j'ai testé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    for ($i = 0; $i < count($tableauPokedex); $i++) {
     
                    if (in_array($_POST['typesSelect'], $tableauPokedex[$i]['type'])) {
                        $liste_cles[] = $value;
                        echo print_r($liste_cles);
                    }
     
                }
    Quelque soit le type que je sélectionne dans le formulaire, cela me renvoie toujours la valeur "Fée". Je ne parviens pas à comprendre pourquoi ?!

    Merci encore pour votre aide.

  4. #4
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 719
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 719
    Par défaut
    si vous parcourez la liste avec une boucle for, vous stockez la clé avec $liste_cles[] = $i;et ensuite pour l'affichage, ça donnera quelque chose comme ça :
    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
    foreach ($liste_cles as $i) {
     
    	echo '<tr>';
    	echo '<td>' . $tableauPokedex[$i]['id'] . '</td>';
     
    	$image = sprintf("%'.03d\n", $i);
    	echo '<td><img width="50" src="./thumbnails/' . $image . '.png"></td>';
     
    	echo '<td>' . $tableauPokedex[$i]['name']['french'] . '</td>';
    	echo '<td>';
     
    	echo    '</td>';
    	echo '</tr>';
     
    }

  5. #5
    Membre averti
    Femme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2019
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2019
    Messages : 12
    Par défaut
    Super !!!

    Cela fonctionne bien, merci beaucoup!

    Voici mes modifications :

    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
     
    if(isset($_POST['validate'])) {
     
                echo '<div class="row">
                                    <div class="col-12">
     
                                        <table class="table">
                                            <thead>
                                                <tr>
                                                    <td>#</td>
                                                    <td>Image</td>
                                                    <td>Nom</td>
                                                    <td>Types</td>
                                                </tr>
                                            </thead>
                                            <tbody>';
     
                for ($i = 0; $i < count($tableauPokedex); $i++) {
     
                    if (in_array($_POST['typesSelect'], $tableauPokedex[$i]['type'])) {
                        $liste_cles[] = $i;
     
                        foreach ($liste_cles as $i) {
     
                            echo '<tr>';
                            echo '<td>' . $tableauPokedex[$i]['id'] . '</td>';
     
                            $image = sprintf("%'.03d\n", $i);
                            echo '<td><img width="50" src="./thumbnails/' . $image . '.png"></td>';
     
                            echo '<td>' . $tableauPokedex[$i]['name']['french'] . '</td>';
                            echo '<td><span class="badge badge-secondary mr-2">' . $tableauPokedex[$i]['type'] . '</span></td>';
                            echo '</tr>';
                        }
     
                        echo '</tbody>
                            </table>
                        </div>
                    </div>';
                    }
     
                }
    Le dernière difficulté est qu'il doit y avoir une boucle en trop, ou bien une boucle au mauvais endroit car les pokémons s'affichent plusieurs fois à la suite.
    Et puis je ne parviens pas à afficher le type.
    J'ai essayé ceci entre autres tentatives :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo '<td><span class="badge badge-secondary mr-2">' . $tableauPokedex[$i]['type'] . '</span></td>';
    mais le type ne s'affiche pas. Le rendu visuel en html doit contenir le type du pokémon...

  6. #6
    Membre averti
    Femme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2019
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2019
    Messages : 12
    Par défaut
    Je pense que le choix d'une boucle for avec incrémentation n'est pas l'idéal car je remarque que cela boucle avec un pokémon en plus à chaque ligne; au lieu de m'afficher la liste en une seule fois.

    J'avoue être perdue alors que je suis sûr de n'être pas loin du but...

Discussions similaires

  1. Réponses: 8
    Dernier message: 26/11/2017, 11h12
  2. [XL-2013] Etablir une liste en fonction de critères
    Par filsdepub dans le forum Excel
    Réponses: 5
    Dernier message: 28/09/2015, 19h11
  3. [MySQL] Récupérer une donnée et afficher une image en fonction
    Par clairetj dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 08/04/2015, 19h31
  4. [Toutes versions] Afficher une liste en fonction de conditions
    Par pledger dans le forum IHM
    Réponses: 3
    Dernier message: 25/01/2013, 08h31
  5. afficher une liste en fonction de la lettre tapée
    Par mademoizel dans le forum ASP
    Réponses: 45
    Dernier message: 15/03/2007, 17h29

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