Page 1 sur 2
Tri alphabétique SQL et traitement PHP
Posté : 20 mars 2009, 22:08
par sylvaing26
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
Posté : 20 mars 2009, 22:17
par julian
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.
Posté : 20 mars 2009, 22:21
par sylvaing26
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 ?
Posté : 20 mars 2009, 22:27
par julian
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
Posté : 20 mars 2009, 22:39
par sylvaing26
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)
Posté : 20 mars 2009, 22:47
par julian
string lcfirst(string)
Posté : 21 mars 2009, 00:55
par sylvaing26
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>";}
Posté : 21 mars 2009, 10:20
par julian
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
}
Posté : 21 mars 2009, 10:43
par sylvaing26
$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)
Posté : 21 mars 2009, 10:58
par julian
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.
Posté : 21 mars 2009, 11:38
par sylvaing26
D'acc, donc en fait dans le foreach ca sera mon tableau sql alors
Posté : 21 mars 2009, 11:47
par julian
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(...))
Posté : 21 mars 2009, 12:13
par sylvaing26
donc j'utilise for ?
Désolé je suis pas doué avec ces boucles là ...

Posté : 21 mars 2009, 12:15
par julian
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
}
Posté : 21 mars 2009, 12:35
par sylvaing26
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;
}