Tri alphabétique SQL et traitement PHP

Mammouth du PHP | 686 Messages

20 mars 2009, 22:08

Bonsoir,
je bute sur un problème, j'effectue une requete sur ma base de donnée qui me trie les données par ordre alphabétique.
Je souhaiterai que dans PHP, je mette une lettre A et tous les noms qui commencent en "a" ensuite puis B etc ...
Est ce qu'il faut que j'effectue une simple requete mysql ou il me trie les données par ordre alphabetique et qu'ensuite j'utilise une fonction de PHP pour récuperer la premiere lettre de l'entrée
.

Selection sql par ordre alphabetique -> fonction PHP qui récupère la première lettre
mais c'est la fonction conditionnelle qui me parait compliquée pour que a chaque lettre majuscule il m'ecrive les entrée recupérées dans mysql

Je ne sais pas si j'ai été clair ...

Merci d'avance

Eléphant du PHP | 141 Messages

20 mars 2009, 22:17

En fait, il faudrait que tu précises. Moi je vois deux solutions :

La première c'est que tu aurait une page par lettre, et la seconde serait que tu as une seule page avec les résultats triés par lettre.

Dans le cas où tu as une page par lettre, le mieux c'est que dans la requête, tu fasse le filtrage pour éviter de traiter toutes les données...
Dans le second cas, tu récupère toutes les données et tu testes en PHP la première lettre pour afficher un nouveau bloc à chaque changement.

Mammouth du PHP | 686 Messages

20 mars 2009, 22:21

Ce que je souhaite faire c'est une page avec toutes les lettres en effet

Ca veut dire qu'il faut que je fasse une condition pour chaque lettre de l'alphabet donc un script php à 26 conditions ?

Eléphant du PHP | 141 Messages

20 mars 2009, 22:27

Non non pas du tout.
Ce que je vois, c'est que tu veux faire un truc du style :
A
- abracadabra
- arbre
- arc

B
- babar
- boite

E
- Ephémère


etc...
Donc tu fais une seule requête SQL qui trie par ordre alphabétique.
Et dans ton while, tu va tester :
1) si la première lettre est identique à la première du mot précédente
tu affiche ton mot simplement
2) si la première lettre est différente de la première du mot précédente
tu affiche cette lettre puis le mot

Mammouth du PHP | 686 Messages

20 mars 2009, 22:39

D'accord je vois parfaitement ta logique, j'y avais pas pensé.
Est ce qu'il existe unz fonction pour mettre la première lettre en minuscule (au cas ou il y ai des majuscules et des minuscules en première lettre)

Eléphant du PHP | 141 Messages

20 mars 2009, 22:47

string lcfirst(string)

Mammouth du PHP | 686 Messages

21 mars 2009, 00:55

J'ai fait cette boucle mais cela ne fonctionne pas il ne me detecte pas le changement de lettre
while($result = mysql_fetch_array($sql)){
                            $genre = $result['genre'];
                            $espece = $result['espece'];
                            $genre = strtolower($genre); ///met tout en minuscules
                            $lettre = $genre[0];
                            
                            if(!$lettre == $lettreprec){
                            echo "<img src=\"img/lettres_fiches/".$lettre.".gif\" width=\"28\" height=\"30\" border=\"0\">";
                            echo "<a href=\"#\" onClick=\"visibilite('".$genre."');\">";
                            echo "<p><font face=\"Arial\"><span style=\"font-size:10pt;\"><b>".$genre."</b></span></font></p>";

                            ///// liste des genres avec espece au clic
                            echo "<div id=\"".$genre."\" style=\"display:none\">";
                            $lettreprec = $lettre;
                            }
                            if($genre[0] == $lettre){
                            $genre = ucfirst($genre);
                            echo "<p><font face=\"Arial\"><span style=\"font-size:10pt;\">".$genre." ".$espece."</span></font></p>";}

Eléphant du PHP | 141 Messages

21 mars 2009, 10:20

Alors, je pense que c'est normal, déjà tu modifier ta lettre précédente dans une condition, ce qui veut dire qu'elle pourra ne pas être modifiée à certain tour de boucle.
Ensuite, tu testes : if($genre[0] == $lettre) alors que tu fais $lettre = $genre[0];

J'ai écrit un morceau de code qui correspond à ce que j'ai expliqué plus haut. C'est avec un foreach mais c'est pareil.
En gros, ce qu'il faut voir, c'est que généralement dans ce type d'affichage, on a une partie du code qui sera toujours afficher quelque soit le cas, donc celle là n'est pas dans un if (puisqu'il est toujours affiché).
Là il suffit de tester que la lettre est différente de la précédente pour ajouter un bout de code html ;)

$wordlist = array("abracadabra", "arbre", "Arc", "babar", "boite", "Ephemere");
// Initialisation des variables
$currentLetter = null; // Contiendra la première lettre du mot courant
$previousLetter = null; // Contiendra la première lettre du mot précédent

foreach ($wordlist as $word) {
	$word = strtolower($word); // On met tout en minuscule
	$currentLetter = $word[0]; // On extrait la première lettre du mot
	
	if ($currentLetter != $previousLetter) {
		echo "<h2>".strtoupper($currentLetter)."</h2>";
	}
	
	echo "- ".$word."<br />"; // Dans tous les cas, on affiche le mot avec un tiret et un saut de ligne
	$previousLetter = $currentLetter; // On redéfinit la lettre précédente
}

Mammouth du PHP | 686 Messages

21 mars 2009, 10:43

$wordlist = array("abracadabra", "arbre", "Arc", "babar", "boite", "Ephemere");
// Initialisation des variables
Comment dans mon cas definir le array sachant que je suis dans une boucle while ?
il faute que je sorte de ma boucle ?
while($result = mysql_fetch_array($sql)){
$genre = array ($result['genre']);}
Avec une boucle for() ce n'est pas possible sans passer par le tableau ?
$genre = $result['genre'];
$genre = strtolower($genre); ///met tout en minuscules
$lettre = $genre[0];
$lettrecourante = $lettre
for($lettrecourante; $lettrecourante != $lettre precedente; $lettreprecedente = $lettrecourante)

Eléphant du PHP | 141 Messages

21 mars 2009, 10:58

Non non ! Tu gardes ta boucle while(). J'ai fais avec un tableau pour avoir une boucle c'est tout, car c'était plus galère pour moi de créer une table SQL etc...

Ta boucle est bien, c'est le code à l'intérieur qu'il faut que tu modifies, pour ajouter les traitements.

Mammouth du PHP | 686 Messages

21 mars 2009, 11:38

D'acc, donc en fait dans le foreach ca sera mon tableau sql alors

Eléphant du PHP | 141 Messages

21 mars 2009, 11:47

Non tu n'utilises pas le foreach.

En fait, moi j'ai des données provenant d'un tableau, donc pour lire chaque éléments du tableau, le plus simple c'est le foreach.
Par contre dans ton cas, tes données proviennent d'une table sql, donc pour lire chaque données de cette table, tu fais un while($x = mysql_fetch_array(...))

Mammouth du PHP | 686 Messages

21 mars 2009, 12:13

donc j'utilise for ?
Désolé je suis pas doué avec ces boucles là ... :roll:

Eléphant du PHP | 141 Messages

21 mars 2009, 12:15

Tu utilises :
while($result = mysql_fetch_array($sql)) {
// Ici tu mets et tu adaptes ce que moi j'ai mis à l'intérieur du foreach
}

Mammouth du PHP | 686 Messages

21 mars 2009, 12:35

J'ai fait cela, ca fonctionne à moitié, car même si c'est la même lettre il traite la condition
while($result = mysql_fetch_array($sql)){
                            $genre = $result['genre'];
                            $espece = $result['espece'];
                            $genre = strtolower($genre); ///met tout en minuscules
                            $lettrecour = $genre[0];
                            $lettreprec = null;
                            
                            if(!$lettrecour == $lettreprec){
                            echo "<img src=\"img/lettres_fiches/".$lettrecour.".gif\" width=\"28\" height=\"30\" border=\"0\">";
                            $genre = ucfirst($genre);
                            echo "<p><font face=\"Arial\"><span onClick=\"visibilite('".$genre."');\" style=\"font-size:10pt;cursor:pointer;\"><b>".$genre."</b></span></font></p>";
                            $genre = strtolower($genre);
                            ///// liste des genres avec espece au clic
                            echo "<div id=\"".$genre."\" style=\"display:none\">";
                            
                            }
                            echo "<p><font face=\"Arial\"><span style=\"font-size:10pt;\">".$genre." ".$espece."</span></font></p>";
                            if(!$lettrecour == $lettreprec){
                            echo "</div>";
                            }
                            $lettreprec = $lettrecour;
 }