8792 sujets

Développement web côté serveur, CMS

Bonjour Smiley smile

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 Smiley cligne


//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:

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);

Modifié par ToxiK (08 Feb 2007 - 10:41)
Administrateur
Bonjour,

je n'ai pas regardé le détail mais dans le principe même, ce ne serait pas plus simple de rajouter une colonne 'statut' (syn: position, rôle) avec comme valeurs "pdg/directeur/contre-maître/ouvrier"? Toutes les entreprises n'ont pas 120.000 salariés mais devoir passer en revue la BDD à la recherche d'une égalité Smiley ohwell
En fait j'essaie d'attaquer le moins possible la base de données.

Donc j'utilise une fonction (procédure stoquée sur le serveur), qui remplie un tableau (array).

Ensuite une fois le tableau crée je peux rechercher :

- le responsable direct d'un salarié

- tous les responsables d'un salarié

- de qui le salarié est le responsable direct

- et quels sont tous les salariés sous la responsabilité d'un autre salarié

Ce n'est pas le statut qui m'interesse mais la place dans la hiérarchie les uns par rapport aux autres.


ps: pour plus de facilité je vais rajouter une colone code_responsable dans mon tableau, ça réduira un peux les fonctions de recherche
Modifié par ToxiK (08 Feb 2007 - 14:47)