Requete SQL sous la forme d'un tableau bidimensionnel [Résolu]

Messages postés
139
Date d'inscription
samedi 19 juillet 2014
Statut
Membre
Dernière intervention
14 août 2019
- - Dernière réponse : victorberson
Messages postés
139
Date d'inscription
samedi 19 juillet 2014
Statut
Membre
Dernière intervention
14 août 2019
- 14 août 2019 à 09:40
Bonjour,

Ma table SQL contient le noms de matière associé à une promotion. Il y à un nombre fini de promotion (5) mais le nombre de matière peut varier
Je souhaite pouvoir récuperer les données de ma table sous la forme d'un tableau a 2 dimension comme ceci :

$tab = array($annee1 = array(Math,Espagnol,etc...), $annee2 = array(Math,Anglais,etc...), etc...)

J'ai essayé ce code mais je manipule mal les tableaux...

$tab = array($IE1 = array(),$IE2 = array(),$IE3 = array(),$IE4 = array(),$IE5 = array());
$sql = "SELECT DISTINCT promo FROM promo_matiere";
if($result=mysqli_query($link,$sql))
{
if(mysqli_num_rows($result) > 0)
{
while($row = mysqli_fetch_assoc($result))
{
$sql2 = "SELECT nom_matiere FROM promo_matiere WHERE promo = ".$row["promo"];
if($result2 = mysqli_query($link,$sql2))
{
if(mysqli_num_rows($result2) > 0)
{
$i1 = 0;
$i2 = 0;
$i3 = 0;
$i4 = 0;
$i5 = 0;
while($row2 = mysqli_fetch_assoc($result2))
{
switch (promoActuelle($row["promo"]))
{
case 1:
$IE1[$i1] = $row2["nom_matiere"];
$i1++;
break;
case 2:
$IE2[$i2] = $row2["nom_matiere"];
$i2++;
break;
case 3:
$IE3[$i3] = $row2["nom_matiere"];
$i3++;
break;
case 4:
$IE4[$i4] = $row2["nom_matiere"];
$i4++;
break;
case 5:
$IE5[$i5] = $row2["nom_matiere"];
$i5++;
break;
}
}
foreach ($tab as $value) {
foreach ($value as $val) {
echo $val."<br/>";
}
}

}
}
}
}
}

Je précise que ce code n'est pas destiné à l'affichage

Merci d'avance pour vos idées et votre aide

Victor
Configuration: Windows / Firefox 68.0
Afficher la suite 

1 réponse

Meilleure réponse
Messages postés
3455
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
14 août 2019
913
1
Merci
Bonjour,

Pour commencer une petite astuce, si tu écris
$tableau[] = $valeur
, PHP va comprendre tout seul qu'il faut mettre $valeur dans la prochaine « case » disponible du tableau. Tu n'as donc pas besoin de t'embêter à gérer les $i.
Deuxième astuce, en PHP les noms de variables sont variabilisables. À savoir, tu peux écrire
$variable1 = 'truc'
aussi bien que
$i = 1;
$variable$i = 'truc'
.
Ces deux éléments combinés font que tout ton switch peut se réduire à :
$i = promoActuelle($row["promo"]);
$IE$i[] = $row2["nom_matiere"];

Ceci dit, l'utilisation de ces multiples variables n'a pas beaucoup d'intérêt, surtout que tu les places déjà dans le tableau $tab. Donc tu peux écrire simplement :
$i = promoActuelle($row["promo"]);
$tab[$i][] = $row2["nom_matiere"];
et supprimer les appellations $IEx de ton code.

Bon, voilà pour la cosmétique.
Passons maintenant au cœur du problème. Je ne comprends pas bien pourquoi tu effectues ta requête en deux étapes alors que toutes les infos sont dans la même table. Tu peux simplement exécuter
SELECT promo, nom_matiere FROM promo_matiere;
, cela te donnera toutes les matières et la promo qui va avec. Comme ça on peut parcourir le résultat en une seule boucle, ce qui évite de se faire des nœuds au cerveau.
Je te propose donc tout simplement :
$tab = array();
$sql2 = "SELECT promo, nom_matiere FROM promo_matiere";
if($result2 = mysqli_query($link, $sql2))
{
    if(mysqli_num_rows($result2) > 0)
    {
        while($row2 = mysqli_fetch_assoc($result2))
        {
            // On récupère les valeurs
            $promo = promoActuelle($row2["promo"]);
            $matiere = $row2["nom_matiere"];

            // On crée le sous tableau la première fois qu'on rencontre cette promo
            if (!isset($tab[$promo]))
                $tab[$promo] = array();

            // On insère la matière dans le tableau voulu.
            $tab[$promo][] = $matiere;
        }
    }
}

foreach ($tab as $promo => $matieres)
{
    echo "<b>Promo $promo</b><br />";
    foreach ($matieres as $matiere)
    {
        echo $matiere . "<br/>";
    }
}


Xavier

Dire « Merci » 1

Heureux de vous avoir aidé ! Vous nous appréciez ? Donnez votre avis sur nous ! Evaluez CommentCaMarche

CCM 58271 internautes nous ont dit merci ce mois-ci

victorberson
Messages postés
139
Date d'inscription
samedi 19 juillet 2014
Statut
Membre
Dernière intervention
14 août 2019
2 -
Je reviens vers toi car j'aimerai ajouté l'id de la matiere a ce tableau.
J'ai essayé ce code mais ca ne fonctionne pas comme je le voudrais...
Une idée?

<?php
$tab = array();
$sql2 = "SELECT promo, nom_matiere, id_matiere FROM promo_matiere";
if($result2 = mysqli_query($link, $sql2))
{
if(mysqli_num_rows($result2) > 0)
{
while($row2 = mysqli_fetch_assoc($result2))
{
// On récupère les valeurs
$promo = promoActuelle($row2["promo"]);
$matiere = $row2["nom_matiere"];
$id = $row2["id_matiere"];

// On crée le sous tableau la première fois qu'on rencontre cette promo
if (!isset($tab[$promo]))
$tab[$promo] = array();
if (!isset($tab[$promo][$matiere]))
$tab[$promo][$matiere] = array();

// On insère la matière dans le tableau voulu.
$tab[$promo][$matiere][] = $matiere;
$tab[$promo][$matiere][] = $id;

foreach ($tab as $promo => $matieres)
{
echo "<h1>".$promo."</h1><br/>";
$text = "";
foreach ($matieres as $matiere) {
echo $matiere[1]." - ".$matiere[0]."<br/>";
}


}
}
}
}
Reivax962
Messages postés
3455
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
14 août 2019
913 -
Qu'est-ce qui ne fonctionne pas comme tu le souhaites, exactement ?
victorberson
Messages postés
139
Date d'inscription
samedi 19 juillet 2014
Statut
Membre
Dernière intervention
14 août 2019
2 -
Et bien quand je fais un var_dump pour voir le contenu de $tab2, il n'y a que un module par matière, ce qui est faux . Si je fais un var_dump sur $row3, je vois pourtant bien s'afficher tous les modules

$tab2 = array();
$sql3 = "SELECT id_matiere, nom_module, id_module FROM matiere_module";
if($result3 = mysqli_query($link, $sql3))
{
if(mysqli_num_rows($result3) > 0)
{
while($row3 = mysqli_fetch_assoc($result3))
{
// On récupère les valeurs
$matiere = $row3["id_matiere"];
$module = $row3["nom_module"];
$id = $row3["id_module"];
var_dump($row3);
// On crée le sous tableau la première fois qu'on rencontre cette promo
if (!isset($tab[$matiere]))
$tab2[$matiere] = array();
if (!isset($tab[$matiere][$module]))
$tab2[$matiere][$module] = array();

// On insère la matière dans le tableau voulu.
$tab2[$matiere][$module][] = $module;
$tab2[$matiere][$module][] = $id;
}
}
}
Reivax962
Messages postés
3455
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
14 août 2019
913 -
Bonjour,

En effet, c'est à cause de ces lignes :
if (!isset($tab[$matiere]))
    $tab2[$matiere] = array();
if (!isset($tab[$matiere][$module]))
    $tab2[$matiere][$module] = array();

Tu testes sur $tab mais tu modifies $tab2.

Xavier
victorberson
Messages postés
139
Date d'inscription
samedi 19 juillet 2014
Statut
Membre
Dernière intervention
14 août 2019
2 -
C'est ca merci beaucoup !!
Commenter la réponse de Reivax962