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

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);
Voilà aussi l'extrait de la table:
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);