Requete SQL sous la forme d'un tableau bidimensionnel

Résolu
victorberson Messages postés 139 Date d'inscription   Statut Membre Dernière intervention   -  
victorberson Messages postés 139 Date d'inscription   Statut Membre Dernière intervention   -
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
A voir également:

1 réponse

Reivax962 Messages postés 3672 Date d'inscription   Statut Membre Dernière intervention   1 011
 
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
1
victorberson Messages postés 139 Date d'inscription   Statut Membre Dernière intervention   5
 
Whoua Xavier ! Merci
J'ai rarement eu une aussi belle réponse. Ca répond parfaitement a mon besoin et j'ai appris pleins de truc !
Merci encore
0
victorberson Messages postés 139 Date d'inscription   Statut Membre Dernière intervention   5
 
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/>";
}


}
}
}
}
0
Reivax962 Messages postés 3672 Date d'inscription   Statut Membre Dernière intervention   1 011
 
Qu'est-ce qui ne fonctionne pas comme tu le souhaites, exactement ?
0
victorberson Messages postés 139 Date d'inscription   Statut Membre Dernière intervention   5
 
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;
}
}
}
0
Reivax962 Messages postés 3672 Date d'inscription   Statut Membre Dernière intervention   1 011
 
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
0