Bonjour
J'aimerais établir une hiérarchie en ne connaissant que le responsable de chaque salarié (un salarié ayant son code salarié comme code responsable est donc en haut de la hiérarchie).
Il m'a donc fallu user de la récursité pour remplir et afficher les tableaux.
J'aimerais maintenant savoir si mon code est bon et si il est sensiblement améliorable.
Merci de jeter un oeuil
Voilà aussi l'extrait de la table:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112 //Fonction d'affichage function affiche_tableau($tableau) { foreach ($tableau as $cle=>$valeur) { // Si l'un des éléments est lui même un tableau // alors on applique la fonction à ce tableau if(is_array($valeur)) { // On affiche le nom de la clé et // le début d'une liste pour // décaler le contenu vers la droite echo $cle." : <ul>\n"; // Ici se réalise la récursivité // c'est à dire qu'on applique la fonction // à l'élément en cours car c'est lui aussi un tableau affiche_tableau($valeur); // On ferme la liste echo "</ul>\n"; } // Si ce n'est pas un tableau // alors on affiche le contenu de l'élément else { echo $cle." = ".$valeur." <br />\n"; }; }; }; // Fonction qui récupère les salariés qui n'ont pas de responsable (donc en haut de la hiérarchie) function sans_responsable($w_rs) { $i=0; while($enreg=mysql_fetch_array($w_rs)) { global $tab_hier; global $tab_deja_entre; if( ($enreg["code_sal"]==$enreg["code_res"] OR empty($enreg["code_res"])) && !in_array($enreg["code_sal"], $tab_deja_entre) ) { $tab_hier[$i]["code_sal"]=$enreg["code_sal"]; $tab_hier[$i]["supervise"]=array(); $tab_deja_entre[]=$enreg["code_sal"]; $i++; }; }; }; // Fonction récursive qui remplie les tableaux function hierarchie($w_rs,&$tableau) { global $tab_deja_entre; $i=0; foreach ($tableau as $cle=>$valeur) { $j=0; mysql_data_seek($w_rs,0); while($enreg=mysql_fetch_array($w_rs)) { if($valeur["code_sal"]==$enreg["code_res"] && !in_array($enreg["code_sal"], $tab_deja_entre)) { $tableau[$i]["supervise"][$j]["code_sal"]=$enreg["code_sal"]; $tableau[$i]["supervise"][$j]["supervise"]=array(); $tab_deja_entre[]=$enreg["code_sal"]; if(is_array($tableau[$i]["supervise"][$j])) { hierarchie($w_rs,$tableau[$i]["supervise"]); mysql_data_seek($w_rs,0); } else { echo "Ce n'est pas un tableau"; }; $j++; }; }; $i++; }; }; ### Connexion $mysql_connexion = mysql_connect("localhost", "root", ""); mysql_select_db('bdd_Test',$mysql_connexion); $req = 'SELECT code_sal, code_res FROM table_test'; $rs = mysql_query($req) or die('Erreur SQL !<br>'.$req.'<br>'.mysql_error()); ### Déclarations $tab_hier=array(); $tab_deja_entre=array(); ### Code sans_responsable($rs); hierarchie($rs,$tab_hier); echo "<br />Tableau de la hiérarchie<br />\n"; affiche_tableau($tab_hier); echo "<br /><br />Tableau deja entre<br />\n"; affiche_tableau($tab_deja_entre);
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 CREATE TABLE `table_test` ( `code_sal` int(11) NOT NULL default '0', `code_res` int(11) NOT NULL default '0' ) ENGINE=MyISAM DEFAULT CHARSET=latin1; INSERT INTO `table_test` VALUES (235, 1310); INSERT INTO `table_test` VALUES (245, 1310); INSERT INTO `table_test` VALUES (320, 1310); INSERT INTO `table_test` VALUES (321, 1310); INSERT INTO `table_test` VALUES (1000, 1000); INSERT INTO `table_test` VALUES (1110, 1000); INSERT INTO `table_test` VALUES (1115, 1000); INSERT INTO `table_test` VALUES (1120, 1110); INSERT INTO `table_test` VALUES (1132, 4100); INSERT INTO `table_test` VALUES (1310, 1000); INSERT INTO `table_test` VALUES (1320, 1320); INSERT INTO `table_test` VALUES (1321, 1320); INSERT INTO `table_test` VALUES (4100, 1000); INSERT INTO `table_test` VALUES (356, 1115); INSERT INTO `table_test` VALUES (567, 1115); INSERT INTO `table_test` VALUES (1990, 1132); INSERT INTO `table_test` VALUES (1180, 1132);
Partager