Page 1 sur 1

Parcours d'un tableau avec foreach

Posté : 23 nov. 2015, 21:02
par albat
Bonjour,

Ah, qu'il est dur de s'y remettre quand on n'a pas codé depuis longtemps...

Je souhaite parcourir un tableau que j'ai rempli avec le résultat d'une requête.
Pour une raison qui n'apparaît pas dans l'extrait de code que je vous donne ci-dessous,
je ne peux trier les résultats au moyen d'un ORDER BY dans la requête SQL,
ce qui aurait été tellement plus simple ! :(

Je stocke donc les résultats dans un tableau.
Je trie le tableau.
Et au moment de constituer une liste avec les résultats de ce tableau - à présent ordonné - ça merdoie.

Voyez-vous où j'ai fait une boulette ?
Merci,
<ul>
<?php
$sql = 'SELECT   per_id, per_nom, per_prenom
        FROM     per_personnes';
$res = mysqli_query($dbase, $sql) or die(mysqli_error($dbase));

// Construction d'un tableau pour stocker les résultats
$tab = array('id','identite');
while($ligne=mysqli_fetch_assoc($res))
	 { extract($ligne);
	   $tab['id'][] = $per_id;
	   $tab['identite'][] = mb_strtoupper($per_nom,'UTF-8').' '.$per_prenom;
	 }

// Tri du tableau selon le champ 'identite'
asort($tab['identite']);

// vérifications
print_r($tab);
var_dump($tab);

// affichage de la liste ordonnée
foreach($tab as list($id,$identite))
       { echo '<li><a href="fiche-'.$id.'.htm">'.$identite.'</a></li>';
       }
?>
</ul>

Re: Parcours d'un tableau avec foreach

Posté : 23 nov. 2015, 22:13
par albat
Sur un conseil - avisé - donné en parallèle (Merci, calimero !), ;)
j'ai changé la structure de mon tableau qui était effectivement erronée.

Voic les modifications apportées :
<ul>
<?php
$sql = 'SELECT   per_id, per_nom, per_prenom
        FROM     per_personnes';
$res = mysqli_query($dbase, $sql) or die(mysqli_error($dbase));

// Construction d'un tableau pour stocker les résultats
while($ligne=mysqli_fetch_assoc($res))
	 { extract($ligne);
	   $identite = mb_strtoupper($per_nom,'UTF-8').' '.$per_prenom;
	   $tab[] = array('id' => $per_id,
                    'identite' => $identite);
	 }

// Tri du tableau selon le champ 'identite'
asort($tab['identite']);

// vérifications
print_r($tab);
var_dump($tab);

// affichage de la liste ordonnée
foreach($tab as $tab_row)
       { echo '<li><a href="fiche-'.$tab_row['id'].'.htm">'.$tab_row['identite'].'</a></li>';
       }
?>
</ul>
Le remplissage se fait bien.
Le foreach fonctionne.
En revanche, le tri ne se fait plus ! :(

Je vérifie mes paramètres...

Re: Parcours d'un tableau avec foreach

Posté : 23 nov. 2015, 22:24
par or 1

Re: Parcours d'un tableau avec foreach

Posté : 23 nov. 2015, 22:26
par albat
Voici la solution !
<ul>
<?php
$sql = 'SELECT   per_id, per_nom, per_prenom
        FROM     per_personnes';
$res = mysqli_query($dbase, $sql) or die(mysqli_error($dbase));

// Construction d'un tableau pour stocker les résultats
$tab = array();
while($ligne=mysqli_fetch_assoc($res))
	 { extract($ligne);
	   $identite = mb_strtoupper($per_nom,'UTF-8').' '.$per_prenom;
	   $tab[$per_id] = $identite;
	 }

// Tri du tableau selon le champ 'identite' (implicite)
asort($tab);

// affichage de la liste ordonnée
foreach($tab as $key=>$value)
       { echo '<li><a href="fiche-'.$key.'.htm">'.$value.'</a></li>';
       }
?>
</ul>
Je me suis bien compliqué la vie pour pas grand-chose. :oops: :evil:

Merci à calimero pour son aide précieuse et efficace ! :love4:

Re: [RESOLU] Parcours d'un tableau avec foreach

Posté : 24 nov. 2015, 01:24
par Genova
Sinon directement en SQL :
SELECT   per_id, per_nom, per_prenom
FROM     per_personnes
ORDER BY UPPER(per_nom), per_prenom

Re: Parcours d'un tableau avec foreach

Posté : 24 nov. 2015, 23:36
par albat
Je souhaite parcourir un tableau que j'ai rempli avec le résultat d'une requête.
Pour une raison qui n'apparaît pas dans l'extrait de code que je vous donne ci-dessous,
je ne peux trier les résultats au moyen d'un ORDER BY dans la requête SQL,
ce qui aurait été tellement plus simple ! :(
;)

Re: [RESOLU] Parcours d'un tableau avec foreach

Posté : 26 nov. 2015, 11:23
par Genova
Désolé, je plaide coupable, je n'avais pas tout lu :oops: