Classement alphabétique

Eléphant du PHP | 136 Messages

03 déc. 2006, 13:36

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
Bisvan :)

ViPHP
ViPHP | 1961 Messages

03 déc. 2006, 13:52

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 />';
   }
}
Modifié en dernier par Ajoloca le 03 déc. 2006, 13:53, modifié 1 fois.
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

ViPHP
ViPHP | 3607 Messages

03 déc. 2006, 13:53

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

Mammouth du PHP | 19672 Messages

03 déc. 2006, 13:57

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. ;)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 19672 Messages

03 déc. 2006, 13:59

<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>
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

ViPHP
ViPHP | 1961 Messages

03 déc. 2006, 14:07

<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>
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

ViPHP
ViPHP | 3607 Messages

03 déc. 2006, 14:11

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

Eléphant du PHP | 136 Messages

03 déc. 2006, 15:29

Bon je crois que j'ai assez d'exemple :D
Merci beaucoup...a moi de taffer maintenant :o
Bisvan :)

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

03 déc. 2006, 15:48

Modération :
Cyrano, Ajoloca, vous me copierez 100 fois :
"Je ne dois pas me disputer avec mes petits camarades sur le forum"
:non:

ViPHP
ViPHP | 1961 Messages

03 déc. 2006, 16:27

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!
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Mammouth du PHP | 19672 Messages

03 déc. 2006, 16:30

lol, tricheur :langue:
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 136 Messages

03 déc. 2006, 19:53

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...
Bisvan :)

ViPHP
ViPHP | 3607 Messages

03 déc. 2006, 19:58

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

Eléphant du PHP | 136 Messages

03 déc. 2006, 20:03

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]
Bisvan :)

ViPHP
ViPHP | 1961 Messages

03 déc. 2006, 20:10

Bonsoir,

Que fais-tu si tu n'as de prénom pour une initiale ?
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein