Bonjour, je requiert à nouveau votre aide car je rencontre un petit problème.

Toujours dans mon système de carte de france, je souhaite afficher pour chaque département, et pour chaque région, le nombre total de membres.

Les informations sur le département, les régions, et le nombre total de membre (par département et par région) sont stockés dans un fichier XML.


Dans un premier temps, je m'occupe des départements : grâce à DOM, je liste tout les départements existant et je les parcours un par un. Je compare l'attribut total du département (dans le fichier XML) à une requête SQL count(*) sur la BDD. Si le nombre est différent, je met à jour la valeur de l'attribut total dans le fichier XML...
Cette partie fonctionne très bien, c'est ensuite que ça se corse.


Je voudrais, pour chaque région, récupérer la valeur de l'attribut total des départements appartenant à la région pour ensuite ajouter ses totaux. Cela me permettrait de déterminer le total de membre de chaque région, simplement en additionnant le total de membres de chaque département qui la compose.


J'ai tenté plusieurs solutions (avec le DOM et du foreach comme ci-dessous), avec et sans parler de fils, avec XPath... mais je n'ai pas réussi à faire fonctionner cette partie du calcul.

Je sollicite donc votre aide pour essayer de trouver une solution plus propre, et surtout, fonctionnel ^^

Code pour calculer le total de membres par région : 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
	$liste_region = $dom->getElementsByTagName("region");  // On liste toutes les régions
 
	foreach($liste_region as $region)
	{
		$total_region = 0;
 
		$region_dep = $region->firstChild; // Premier fils (premier département)
 
 
		while ($region_dep =! $region->lastChild)
		{
			$total_region = $total_region + $region_dep->getAttribute("total");
			$region_dep = $region_dep->nextSibling;
		}
 
 
		$total_region = $total_region + $region_dep->getAttribute("total"); // Pour le dernier fils (département)
 
		$region_nom = $region->getAttribute("nom_simple"); // On récupère le nom simple (sans nombre de membre)
		$region->setAttribute("total", $total_region); // Mis à jour du total région dans le XML
 
 
		if ($total_region == 0) {
			$texte = $region_nom . utf8_encode(" (aucun membre)");
		} elseif ($total_region == 1) {
			$texte = $region_nom . utf8_encode(" (1 membre)");
		} elseif ($total_region > 1) {
			$texte = $region_nom . utf8_encode(" (" . $total_region . " membres)");
		}
 
		$region->setAttribute("name", $texte); // Mis à jour de l'infobulle
	}


Code extrait de mon fichier XML : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
<departements>
		<region name="Bretagne" enable="true" href="#" zoomable="true">
			<dep num="29" href="liste.php?dep=29" nom="Finistère" total="0">Finistère (aucun membre)</dep>
			<dep num="22" href="liste.php?dep=22" nom="Côtes-d'Armor" total="0">Côtes-d'Armor (aucun membre)</dep>
			<dep num="56" href="liste.php?dep=56" nom="Morbihan" total="0">Morbihan (aucun membre)</dep>
			<dep num="35" href="liste.php?dep=35" nom="Ille-et-Vilaine" total="0">Ille-et-Vilaine (aucun membre)</dep>
		</region>
		<region name="Basse Normandie" enable="true" src="#" zoomable="true">
			<dep num="50" href="liste.php?dep=50" nom="Manche" total="0">Manche (aucun membre)</dep>
			<dep num="14" href="liste.php?dep=14" nom="Calvados" total="0">Calvados (aucun membre)</dep>
			<dep num="61" href="liste.php?dep=61" nom="Orne" total="0">Orne (aucun membre)</dep>
		</region>
</departements>




Si ça peut servir (et au cas où il y est une erreur à corriger, ou une solution plus simple), voici aussi le bout de code, qui fonctionne, pour calculer le nombre de membre par département. Il s'exécute juste avant le calcul pour les régions.

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
	$dom = new DomDocument();
	$dom->load('datas.xml');
 
	// DEPARTEMENTS
	$liste_dep = $dom->getElementsByTagName("dep");  // On liste tout les départements
 
 
	foreach($liste_dep as $dep)
	{	
		$dep_num = $dep->getAttribute("num");
		$total_xml = $dep->getAttribute("total");	
 
 
		// Compte le nombre de membres du département courant
		$req = "SELECT count(*) FROM test_membres WHERE dep = '$dep_num'";
		$res = mysqli_query($cx,$req) or die("Erreur : problème de requête pour déterminer le nombre de membres.");
 
		$total_new = mysqli_fetch_array($res);
		$total_new = $total_new["count(*)"];
 
 
		if ($total_new != $total_xml)
		{
			$dep_nom = $dep->getAttribute("nom"); // On récupère le nom
			$dep->setAttribute("total", $total_new); // Mis à jour du total dans le XML
 
 
			if ($total_new == 0) {
				$texte = $dep_nom . utf8_encode(" (aucun membre)");
			} elseif ($total_new == 1) {
				$texte = $dep_nom . utf8_encode(" (1 membre)");
			} elseif ($total_new > 1) {
				$texte = $dep_nom . utf8_encode(" (" . $total_new . " membres)");
			}
 
			$dep->nodeValue=$texte; // Mis à jour du noeud
		}
 
	}
Merci d'avance pour votre aide.