Page 1 sur 4

Classement alphabétique

Posté : 03 déc. 2006, 13:36
par Bisvan
Bonjour,

j'aimerais récupérer une liste de prénoms d'une table mysql par ordre alphabétique.
Jusque là pas de problème.
Sauf que j'aimerais afficher la première lettre du prénom de chaque prénom UNE FOIS avant la liste.

Exemple :

LETTRE A
Alphonse
Anatole

LETTRE B
Benoit
Benjamin

etc...

Je peux utiliser la fonction suivante :
$prem_lettre = substr("$prenom", 0, 1);

Mais je ne sais pas comment le gérer en boucle "automatique" avec mysql et php...car pour l'heure il m'affiche :
Lettre A
Alphonse
Lettre A
Anatole

Merci pour votre aide :)

Bisvan

Posté : 03 déc. 2006, 13:52
par Ajoloca
Bonjour,

Tu n'as qu'a conserver la dernière lettre affichée, tester si elle est égale à l'actuelle.
Si c'est pas le cas tu l'affiches et tu la conserves
Exp
// On suppose que les accès à la base et la requête sont faits

$derniereInitiale = '';
while($row = mysql_fetch_assoc($result)){
   $initialeActuelle = substr($row['prenom'], 0, 1);
   if($initialeActuelle != $derniereInitiale){
      $derniereInitiale = $initialeActuelle;
      echo 'LETTRE' . $derniereInitiale .'<br />';
   }
}

Posté : 03 déc. 2006, 13:53
par jojolapine
pour rester dans le principe que tu as commencé:
//début boucle

    $prem_lettre = substr("$prenom", 0, 1);

    if($prem_lettre_precedente!=$prem_lettre){
         echo $prem_lettre;
         $prem_lettre_precedente=$prem_lettre;
    }
    //affichage des noms
//fin boucle

Posté : 03 déc. 2006, 13:57
par Cyrano
Pas très compliqué, regarde et suis les commentaires du code :
<?php
/* La liste des prénoms */
$prenoms = array("Alphonse", "Anatole", "Benoît", "Benjamin");
/* On compte les prénoms */
$nb = count($prenoms);
/* On crée un point de repère vide au départ */
$lettre = "";
/* On boucle sur la liste des prénoms */
for($i = 0; $i < $nb; $i++)
{
    /* Récupération de la première lettre du prénom en cours */
    $prem_lettre = substr($prenoms[$i], 0, 1);
    /* Si la première lettre est différente du pointeur : */
    if($lettre != $prem_lettre)
    {
        /* On affiche la ligne indiquant la lettre */
        echo("<strong>Lettre ". $prem_lettre ."</strong><br />\n");
        /* On assigne la valeur de cette première lettre au point de repère */
        $lettre = $prem_lettre;
    }
    /* On affiche le prénom */
    echo($prenoms[$i] ."<br />\n");
}
?>
Pour l'exemple, je suis parti d'un tableau pour stocker les prénoms, ça fonctionnera aussi bien avec une liste issue d'une base de données. Le principe consiste à créer un point de repère $lettre : à chaque tour, je vais comparer la première lettre du prénom avec ce point de repère : s'il est différent, alors j'affiche la lettre et j'assigne cette valeur à mon point de repère : au tour suivant, je fais la même comparaison : comme j'ai assigné une valeur, par exemple "A" au moment de traiter "Alphonse", quand j'arrive sur "Anatole", mon repère vaut toujours "A", on ne remplit donc pas la condition du if() et on passe directement à l'affichage du prénom. Au tour suivant, j'arrive sur "Benoît" : le repère vaut "A" mais la première lettre vaut "B" : la condition du if() est remplie, j'affiche la ligne de la lettre et j'assigne la nouvelle valeur à mon repère.

Et ainsi de suite. ;)

Posté : 03 déc. 2006, 13:59
par Cyrano
<mode mauvaise foi>
Bon, ils m'ont pris de vitesse, mais mon explication est plus complète, donc j'ai gagné quand même :langue:
</mode mauvaise foi>

Posté : 03 déc. 2006, 14:07
par Ajoloca
<mode mauvaise foi>
Bon, ils m'ont pris de vitesse, mais mon explication est plus complète, donc j'ai gagné quand même :langue:
</mode mauvaise foi>
C'est l'entrainement qui porte ses fruits, c'est tout.
<mode mauvaise foi>
C'est pas le nombre de mots qui détermine la qualité d'une explication.
La mienne est claire et concise donc plus facile à retenir.
Conclusion : elle est meilleure!
</mode mauvaise foi>

Posté : 03 déc. 2006, 14:11
par jojolapine
Bon moi je m'attarde pas sur la place que j'ai parceque c'est concis c'est sur, après clair ? :-*
j'ai failli éditer mon post pou mettre des commentaire dans a source... mais j'ai eu la flème

Posté : 03 déc. 2006, 15:29
par Bisvan
Bon je crois que j'ai assez d'exemple :D
Merci beaucoup...a moi de taffer maintenant :o

Posté : 03 déc. 2006, 15:48
par albat
Modération :
Cyrano, Ajoloca, vous me copierez 100 fois :
"Je ne dois pas me disputer avec mes petits camarades sur le forum"
:non:

Posté : 03 déc. 2006, 16:27
par Ajoloca
Modération :
Cyrano, Ajoloca, vous me copierez 100 fois :
"Je ne dois pas me disputer avec mes petits camarades sur le forum"
:non:
Oui, chef !
<?php
for ($i = 0; $i < 100; $i++)
   echo "Je ne dois pas me disputer avec mes petits camarades sur le forum<br />";
?>
V'là M'sieu, c'est fait!

Posté : 03 déc. 2006, 16:30
par Cyrano
lol, tricheur :langue:

Posté : 03 déc. 2006, 19:53
par Bisvan
toc toc...

et si je vous demande comment afficher le résultat sur deux colonnes...j'en demande trop ? :P

J'ai essayé un truc du genre :

$test++;

if ($test == 2)
{
echo '</tr><tr>';
$test=0;
}
}
echo '</tr>' ;

mais morche po...

Posté : 03 déc. 2006, 19:58
par jojolapine
qu'entend tu par affiché sur deux colonnes ?
comme ceci:

Code : Tout sélectionner

colonne1|colonne2 ----------------- a.... |m.... a.... |m.... a.... |n.... b.... |n.... b.... |o.... etc |etc ou alors: colonne1|colonne2 ----------------- A |a... |a... |a... |a... B |b... |b... |b...
dis nous plus précisément ce que tu veux

Posté : 03 déc. 2006, 20:03
par Bisvan
oups désolé...

en fait :

colonne1|colonne2
-----------------
LETTREA|LETTREB
prénom |prénom
prénom |prénom
prénom |prénom
prénom |prénom
...etc |etc
-----------------
LETTREB|LETTREC
prénom |prénom
prénom |prénom
prénom |prénom
prénom |prénom
...etc |etc

[/code]

Posté : 03 déc. 2006, 20:10
par Ajoloca
Bonsoir,

Que fais-tu si tu n'as de prénom pour une initiale ?