[RESOLU] Foreach sur tableau à 2 dimensions

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

02 déc. 2015, 07:10

Bonjour,

Alors, là, je ne comprends plus.
Je crée un tableau à deux dimensions, je le remplis au moyen d'une requête SQL et quand je veux le lire, ça merdoie.
J'ai beau me relire, je vois pas le schmurtz...
$tab = array();
$sql = "SELECT membre_id, membre_nom, membre_age
        FROM   membres
        WHERE  membre_actif = 1";
$res = mysqli_query($dbase, $sql) or die(mysqli_error($dbase));
while($ligne=mysqli_fetch_assoc($res))
     { extract($ligne);
	     $tab['nom'][$membre_id] = $membre_nom;
       $tab['age'][$membre_id] = $membre_age;
     }
var_dump($tab); // JUSQU'ICI, TOUT VA BIEN
foreach($tab as $key=>$val)
		{ echo '<li>membre n°'.$key.' - nom : '.$val['nom'].' - âge : '.$val['age'].'</li>'; // LÀ, J'AI UN "UNDEFINED INDEX"
		}

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

02 déc. 2015, 07:12

C'est pourtant la même chose que ça, non ?
http://stackoverflow.com/questions/1099 ... reach-loop

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

02 déc. 2015, 09:52

foreach($tab ...
$tab ne contient que 2 éléments ['nom'] et ['age']
Et c'est $tab['nom'] qui contient tous les éléments de nom sur lequel tu veux probablement boucler...

La solution la + simple, c'est d'affecter tes valeurs comme cela :
$tab[$membre_id]['nom'] = $membre_nom;
       $tab[$membre_id]['age'] = $membre_age;
Ainsi $tab contiendra tous tes membres et pour chacun tu pourras récupérer facilement le nom et l'age
Quand tout le reste a échoué, lisez le mode d'emploi...

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

02 déc. 2015, 10:00

J'ai essayé d'inverser l'orientation du tableau.
Cela me paraît en effet plus logique et Calimero m'avait également précédemment conseillé de le faire.

Le hic, c'est que j'effectue un tri de ce tableau sur la "colonne" $tab['nom']
Je ne l'ai pas inclus dans l'extrait de code communiqué ci-dessus.
Vioc la version complétée.
$tab = array();
$sql = "SELECT membre_id, membre_nom, membre_age
        FROM   membres
        WHERE  membre_actif = 1";
$res = mysqli_query($dbase, $sql) or die(mysqli_error($dbase));
while($ligne=mysqli_fetch_assoc($res))
     { extract($ligne);
       $tab['nom'][$membre_id] = $membre_nom;
       $tab['age'][$membre_id] = $membre_age;
     }
uasort($tab['nom'], 'compare_sansaccent');
var_dump($tab); // JUSQU'ICI, TOUT VA BIEN
foreach($tab as $key=>$val)
    { echo '<li>membre n°'.$key.' - nom : '.$val['nom'].' - âge : '.$val['age'].'</li>'; // LÀ, J'AI UN "UNDEFINED INDEX"
    }
Si je construis mon tableau ainsi :
$tab[$membre_id]['nom'] = $membre_nom;
$tab[$membre_id]['age'] = $membre_age;
le tri sur le nom ne fonctionne plus.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

02 déc. 2015, 10:26

Ah...

Bah il faut que tu boucles sur les noms alors :
foreach($tab['nom'] as $membre_id => $nom) { 
    echo '<li>membre n°'.$membre_id.' - nom : '.$nom.' - âge : '.$val['age'][$membre_id].'</li>';
}
Quand tout le reste a échoué, lisez le mode d'emploi...

Mammouth du PHP | 1967 Messages

02 déc. 2015, 10:40

Ou tu peux mettre le nom comme index premier et enregistrer l'id dans le tableau
$tab[$membre_nom]['id'] = $membre_id;
$tab[$membre_nom]['age'] = $membre_age;
Cela aurai l'avantage de te passer de fonction de tri personaliser car tu peux aussi faire ceci :
$nom_sans_accent = remove_accent($membre_nom);
$tab[$nom_sans_accent]['id'] = $membre_id;
$tab[$nom_sans_accent]['nom'] = $membre_nom;
$tab[$nom_sans_accent]['age'] = $membre_age;
la fonction remove_accent comprends ton remplacement d'accent que tu as dans ta fonction de tri perso

Un simple ksort te suffit alors pour trier ton tableau.

Point de vue performance, c'est probablement mieux car tu ne remplace tout tes accents qu'une fois par nom
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

02 déc. 2015, 12:01

Forts, vous êtes. ;)

Merci !!!

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

02 déc. 2015, 23:16

Modération :
Si ta question est résolue, pense à l'indiquer pour que les futures personnes qui voudront consulter ce sujet sachent qu'il contient une solution.
Tu peux réaliser cette opération toi-même en cliquant sur le bouton "Résolu" situé en haut de la page.


Rah lala ces admin... |(X
Quand tout le reste a échoué, lisez le mode d'emploi...

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

06 déc. 2015, 18:48

Pouvez répéter la question ?...

Modération :
Je te propose un petit jeu :
Oublie que tu es l'auteur de ce sujet et relis attentivement ta demande.

Si tu ne la comprends pas, ça prouve qu'il est nécessaire de la re-rédiger.
Si tu la comprends, profites-en pour la re-rédiger, parce que nous... on ne la comprend pas ! ;)