[résolu]Tableau à 2 dimensions

Eléphant du PHP | 103 Messages

29 août 2011, 11:23

Bonjour,

Je fais appel à vous pro du PHP car j'ai besoin d'aide.

J'ai reussi à créer un tableau à 2 dimensions contenant bien les informations que je souhaite :
$niv[$codeco][$mat]


Actuellement, le tableau est comme suit :
Array ( [35] => Array ( [1] => 2 [2] => 2 ) [6] => Array ( [1] => 4 [2] => 1 ) [20] => Array ( [1] => 3 [2] => 4 ) [11] => Array ( [1] => 2 [2] => 2 ) [14] => Array ( [1] => 1 [2] => 4 ) )

Maintenant il faut que je fasse du traitement sur ce tableau en vue d'afficher un graphique et c'est là que je fais appel à vous.
Donc 35, 6, 20, 11 et 14 correspondent à des compétences. Pour chacune de ces compétences il y a 2 personnes [1] et [2] qui ont un niveau.
Je cherche à calculer pour chaque compétence, le min, le max et la moyenne.
Exemple pour la compétence [6], min = 1, max = 4, moyenne = 3 (2,5 arrondi à l'entier supérieur)
Il me faudrait ces infos sous forme de variables pour après afficher mon graphique.

Merci.
Modifié en dernier par Jibe le 15 sept. 2011, 12:33, modifié 1 fois.

ViPHP
ViPHP | 3607 Messages

29 août 2011, 13:48

Et bien ça ne va pas être très difficile, il suffit de parcourir ton tableau comme ceci:
<?php

foreach($niv as $codeco=>$users){

    $niv[$codeco]=array(
        'moyenne'=>array_sum($users)/count($users),
        'max'    =>max($users),
        'min'    =>min($users)
    );
}

var_dump($niv);

Eléphant du PHP | 103 Messages

29 août 2011, 14:10

Merci jojolapine. Faut maintenant que je trouve comment me servir de tout ça pour construire mes graphiques.

Ca m'affiche bien les informations que je cherche mais je ne sais pas du tout comment m'en servir pour afficher mes graphiques :(

Eléphant du PHP | 103 Messages

29 août 2011, 17:35

Peut-être allez-vous pouvoir m'aider pour la suite.

Voilà un code qui va me permettre de générer mes graphiques :
$requ = $bdd->query('SELECT codescomp, niveau FROM l_miss_scomp WHERE codemiss = '.$miss.'');
$scomp = array();
$niv = array();
while($donn = $requ->fetch())
{
	$codesc = $donn['codescomp'];
	$niv[] = $donn['niveau'];
	
	$rep = $bdd->query('SELECT libscomp FROM scompetence WHERE codescomp = '.$codesc.'');
	while($donnees = $rep->fetch())
	{
		$scomp[] = $donnees['libscomp'];
	}
}
Il faudrait que mettre là dedans $moy[], $min[] et $max[] par rapport à ce qui a été dit précédemment et je n'ai aucune idée de comment faire. En gros je veux faire un graphique en toile d'araignée avec les compétences, min, max et moyenne.

Merci.

Mammouth du PHP | 2278 Messages

29 août 2011, 17:42

Moi qui suis basiquement idiot, je chercherais à exporter mon tableau et à le faire traiter par un logiciel de stats quelconque, depuis un tableur jusqu'à R ...
Mais ce que j'en dis ou souffler dans le pavillon d'une clarinette dans l'espoir d'entendre le son d'un violon, c'est blanche-neige et femme de héros, disait le capitaine Héro venu faire une conférence sur la drogue (authentique)
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphant du PHP | 103 Messages

30 août 2011, 09:45

Mais moi je dois faire tourner ça dans une application intranet ou quand tu appuies sur un bouton, le graphique s'affiche

ViPHP
ViPHP | 2577 Messages

30 août 2011, 10:16

Bonjour,

pour créer une image à partir d'un modèle : http://www.php.net/manual/fr/function.i ... romgif.php
pour tracer un polygone : http://www.php.net/manual/fr/function.imagepolygon.php
Autrement, il existe les fonctions sin() et cos() pour calculer tes points.

Bon courage

Eléphant du PHP | 103 Messages

30 août 2011, 10:20

Merci pour ta réponse Mazarini mais mon problème n'est pas le tracé du graphique. Ca je sais le faire. Ce qui me pose problème c'est l'exploitation des données de mon tableau à 2 dimensions.
J'aimerai faire 3 tableaux :
$max[]
$moy[]
$min[]
à partir des données contenues dans le tableaux à 2 dimensions, mais je ne sais pas faire.

ViPHP
ViPHP | 3607 Messages

30 août 2011, 10:30

Bonjour,

Il faudrait avant tout nous montrer à quoi ressembles les données utilisables pour la construction de ton graphique...
En gros tu pars de quoi, et tu veux aller où...

Eléphant du PHP | 103 Messages

30 août 2011, 10:49

OK, je vais essayer d'expliquer ça clairement. Le but de cette partie de mon application c'est de comparer les compétences d'une équipe aux compétences d'une mission. Dans la 1ère IHM, l'utilisateur sélectionne une mission, une équipe et une date. Pour l'extraction de données en base :
$niv = array();
				$sql = $bdd->query('SELECT codecomp FROM l_miss_comp WHERE codemiss = '.$codemiss.'');
				while($don = $sql->fetch())
				{
					$codeco = $don['codecomp'];
					
					$sq = $bdd->query('SELECT matricule FROM l_collab_eq WHERE codeeq = '.$codeeq.'');
					while($do = $sq->fetch())
					{
						$mat = $do['matricule'];
						
						$s = $bdd->query("SELECT DISTINCT nive FROM l_collab_niv_fct WHERE date = '$datet' AND matricule = ".$mat." AND codecomp = ".$codeco."");
						while($te = $s->fetch())
						{	
							$niv[$codeco][$mat] = $te['nive'];
						}
					}
				}
								
				foreach($niv as $codeco=>$mat){

				$niv[$codeco]=array(
					'moyenne'=>array_sum($mat)/count($mat),
					'max'    =>max($mat),
					'min'    =>min($mat)
					);
					}

				$_SESSION['eq'] = $codeeq;
				$_SESSION['miss'] = $codemiss;
				$_SESSION['nivcolabcomp'] = $niv; 
La première requête sort les compétences de la missions. La deuxième extrait les acteurs qui composent l'équipe. La troisième sélectionne le niveau de ces acteurs quand ils ont les compétences qui correspondent à celles de la mission.

Puis voilà la page de création du graphique (enfin juste le code d'extraction):
$eq = $_SESSION['eq'];
$miss = $_SESSION['miss'];
$niv = $_SESSION['nivcolabcomp'];
 
$requ = $bdd->query('SELECT codescomp, niveau FROM l_miss_scomp WHERE codemiss = '.$miss.'');
$scomp = array();
$niv = array();
while($donn = $requ->fetch())
{
	$codesc = $donn['codescomp'];
	$niv_cible[] = $donn['niveau'];
	
	$rep = $bdd->query('SELECT libscomp FROM scompetence WHERE codescomp = '.$codesc.'');
	while($donnees = $rep->fetch())
	{
		$scomp[] = $donnees['libscomp'];
	}
}
La 1ère requête sélectionne les codes des compétences de la missions avec les niveaux cibles et la 2ème requête sort les libellés des compétences. Donc sur mon graphique en toile d'araignée j'aurai un premier tracé correspondant aux compétences de la mission avec leur niveaux cibles. Sur ce même graphique je voudrais insérer les min, max et moy de contenues dans mon tableau à 2 dimensions mais je ne sais pas comment faire pour avoir un
$min[] = valeur des min pour chaque compétences
$max[] = valeur des max pour chaque compétences
$moy[] = valeur des moyennes pour chaque compétences
Est-ce plus claire ?

ViPHP
ViPHP | 2577 Messages

30 août 2011, 13:44

En remplacant
$niv[$codeco]=array(
'moyenne'=>array_sum($mat)/count($mat),
'max' =>max($mat),
'min' =>min($mat)
);

par

$moy[$codeco] = array_sum($mat)/count($mat);
$max[$codeco] = max($mat);
$'min[$codeco] = min($mat);

Eléphant du PHP | 103 Messages

30 août 2011, 14:57

Oui c'est bien ça. Merci Mazarini, j'ai trouvé en cherchant sur le net peu de temps avant que tu répondes.
J'ai une dernière question.
Il est possible que les acteurs n'est pas un niveau pour toutes les compétences d'une missions, si c'est le cas le nombre de valeurs ne sera donc pas le même entre celles que j'obtiens à partir des calculs par les variables php et celles que j'extrais de la base.
Du coup, comment faire une comparaison entre 2 tableaux et si l'un est plus grand que l'autre, rajouter les clés manquantes avec 0 pour valeur ?

ViPHP
ViPHP | 2577 Messages

30 août 2011, 15:45

Tu peux initialiser le $niv[$codeco][$mat] à 0 avant de l'alimenter avec les valeurs de la base dans la mesure ou tu connais les compétences et les personnes.

Eléphant du PHP | 103 Messages

30 août 2011, 16:01

Je dois surement me tromper d'endroit :
$niv = array();
				$sql = $bdd->query('SELECT codecomp FROM l_miss_comp WHERE codemiss = '.$codemiss.'');
				while($don = $sql->fetch())
				{
					$codeco = $don['codecomp'];
					
					$sq = $bdd->query('SELECT matricule FROM l_collab_eq WHERE codeeq = '.$codeeq.'');
					while($do = $sq->fetch())
					{
						$mat = $do['matricule'];
                                                $niv[$codeco][$mat] = 0;
						
						$s = $bdd->query("SELECT DISTINCT nive FROM l_collab_niv_fct WHERE date = '$datet' AND matricule = ".$mat." AND codecomp = ".$codeco."");
						while($te = $s->fetch())
						{	
							$niv[$codeco][$mat] = $te['nive'];
						}
					}
				}
Là du coup pour chaque acteur j'aurai une valeur = 0. Donc pour les compétences ou aucun acteur n'a de niveau c'est bon mais pour les autres ca me rajoute un 0 au calcul de moyenne, min et max. Je l'ai instancié au mauvais endroit ou de la mauvaise manière ?

Voilà les codes des compétences :
77
80
38
14
55
19
45

Sans l'instancier, j'ai ca :
Array ( [77] => Array ( [2] => 2 ) [80] => Array ( [2] => 4 ) [38] => Array ( [2] => 2 ) [14] => Array ( [2] => 3 ) [45] => Array ( [2] => 1 ) )

En l'instanciant j'ai ca :
Array ( [77] => Array ( [1] => 0 [2] => 2 ) [80] => Array ( [1] => 0 [2] => 4 ) [38] => Array ( [1] => 0 [2] => 2 ) [14] => Array ( [1] => 0 [2] => 3 ) [55] => Array ( [1] => 0 [2] => 0 ) [19] => Array ( [1] => 0 [2] => 0 ) [45] => Array ( [1] => 0 [2] => 1 ) )


Ce qui veut dire que par exemple pour la compétence 77, la moyenne sera sans instancier 2 et en instanciant 1... (la moyenne correct étant 2)

Eléphant du PHP | 103 Messages

30 août 2011, 17:14

Comment faire un mixe des deux pour avoir :

Array ( [77] => Array ( [2] => 2 ) [80] => Array ( [2] => 4 ) [38] => Array ( [2] => 2 ) [14] => Array ( [2] => 3 ) [55] => Array ( [1] => 0 [2] => 0 ) [19] => Array ( [1] => 0 [2] => 0 ) [45] => Array ( [2] => 1 ) )

Si pour une compétence il existe au moins un niveau différent de 0, on supprime les 0 sinon on les laisse :( :shock: :?: