Requete SQL sous la forme d'un tableau bidimensionnel

Résolu/Fermé
victorberson Messages postés 139 Date d'inscription samedi 19 juillet 2014 Statut Membre Dernière intervention 14 août 2019 - 12 août 2019 à 12:37
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

1 réponse

Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
12 août 2019 à 14:15
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 samedi 19 juillet 2014 Statut Membre Dernière intervention 14 août 2019 5
12 août 2019 à 20:19
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 samedi 19 juillet 2014 Statut Membre Dernière intervention 14 août 2019 5
13 août 2019 à 12:09
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 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
13 août 2019 à 13:09
Qu'est-ce qui ne fonctionne pas comme tu le souhaites, exactement ?
0
victorberson Messages postés 139 Date d'inscription samedi 19 juillet 2014 Statut Membre Dernière intervention 14 août 2019 5
13 août 2019 à 14:45
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 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
14 août 2019 à 09:38
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