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:
Modifié par ToxiK (08 Feb 2007 - 10:41)

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

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