Tri des données d'une table

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Tri des données d'une table

par Lunatik » 24 oct. 2006, 09:21

Bonjour,

J'ai suivi la piste de Ryle, et j'ai trouvé le code suivant un peu adapté qui répond à mes attentes:

Code : Tout sélectionner

/*cette fonction gère le décallage des éléments suivant leur position dans l'arborescence */ function espace($rang) { $ch=""; for ($x=0;$x<$rang;$x++) { $ch=$ch."    "; } return $ch; } /*fonction récursive d'affichage de l'arbre $tab :tableau des éléments $pere :index de l'élément courrant $rang :décallage de l'élément */ function recur($tab,$pere,$rang) { //ballayage du tableau for ($x=0;$x<count($tab);$x++) { //si un élément a pour père : $pere if ($tab[$x][1]==$pere) { //on l'affiche avec le décallage courant echo "<tr><td>".espace($rang).$tab[$x][2]."</td></tr>"; /*et on recherche ses fils en rappelant la fonction recur() (+ incrémentation du décallage)*/ recur($tab,$tab[$x][0],$rang+1); } } } $sql="SELECT * FROM `folder` WHERE `archive`=0 ORDER BY `nomDossier`"; $req=mysql_query($sql) or die(mysql_error()); /*-------------------- MAIN ----------------------- tableau des éléments de l'arbre: c'est un tableau à 2 dimensions. Une ligne représente un élément : data[$x] chaque ligne est décomposée en 3 données: - l'index de l'élément - l'index de l'élément parent - la chaîne à afficher ie: data[]= array (index, index parent, chaine ) */ //il faut d'abord déclarer un élément racine de l'arbre $data[] = array(0,-1,"DOSSIERS COURANTS"); $i=1; while($enr=mysql_fetch_array($req)){ $data[]=array($enr['idDossier'],$enr['parent'],$enr['nomDossier']); } //appelle de la fonction récursive (ammorce) //avec recherche depuis la racine. ?> <table width="800px" bordercolor="#333333" border="1 solid" style="border-collapse:collapse"> <? recur($data,0,0); ?> </table>
Merci à tous

par Lunatik » 23 oct. 2006, 13:29

merci à tous pour vos réponses.

Est-ce que tu pourrais me donner un exemple ryle ??

D'avance, Merci

par Ryle » 23 oct. 2006, 13:19

Ne sachant pas à l'avance combien il y a de sous dossiers, et plutôt que d'imbriquer nombre de requête, je me contenterais d'une simple requête sql ramenant tous les enregistrements triés par ordre alphabétique simple, que je stockerais dans un tableau associatif de la forme : parent => nom.

Puis je parcourerais ce tableau à l'aide d'une fonction récursive en affichant tous les éléments dont le "parent" est égal à la valeur passée en paramètre, et en rappelant la fonction pour ceux-ci.

Ainsi en supposant que pour les dossiers à la racine le "parent" soit égal à "0", il parcourerait le tableau une première fois à la recherche des parent à 0, pour chacun il rechercherait alors dans le tableau les fils dont le parent est égal à l'id de ce dernier et ainsi de suite...

par Mim » 23 oct. 2006, 13:10

Quelle différence entre la première requête, qui marche, et la deuxième, qui échoue ? Les apostrophes !
Dans ton code, en outre, tu ne vérifies pas le résultat de $req2 (tu le fais pour $req1)... Comment savoir ce qui cloche dans ce cas ? ;-))

par Lunatik » 23 oct. 2006, 12:59

j'ai fait un essai avec ceci:

Code : Tout sélectionner

<? include('acces.php'); $sql="SELECT * FROM folder where archive=0 ORDER BY parent,idDossier "; $req=mysql_query($sql) or die(mysql_error()); ?> <html> <head> <title>Document sans titre</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head> <body> <? while($enr=mysql_fetch_array($req)){ $sql2="SELECT * FROM `folder` WHERE `archive`=0 AND `parent`='".$enr['idDossier']."'"; $req2=mysql_query($sql2); echo "<b>".$enr['idDossier']." - ".$enr['nomDossier']." - ".$enr['parent']."</b><br>"; while($enr2=mysql_fetch_array($req2)){ echo "---->".$enr2['nomDossier']."<br>"; } } ?>
Ca marche avec un seul niveau de sous-dossier. mais je n'arrive pas à développer.

Merci

par Cyrano » 23 oct. 2006, 09:52

Qu'as-tu déjà essayé ? à priori, je dirais que c'est un problème de SQL à la base et pas encore de PHP.

Tri des données d'une table

par Lunatik » 23 oct. 2006, 09:16

Bonjour,

Je dispose d'une table avec les champs suivants:
`id`,`nom`,`parent`. Cette table sert à définir des dossiers de classification. Le champ `parent` indique ici l'id du dossier conteneur, s'il existe.
Il n'y a pas de limitation à la création de sous-dossiers.
Je souhaite pouvoir afficher l'ensemble des dossiers pour impression, par ordre alphabétique et en affichant les sous-dossiers.
Je n'y arrive pas. Quelqu'un a t-il une piste ??

Par avance, merci.