Page 1 sur 1

Problème de boucle while ? (si c'est la bonne méthode ;-)

Posté : 25 avr. 2006, 16:27
par nougitch
Bonjour à tous,

Tout de suite, merci à ceux qui voudront bien m'aider.
Je m'arrache les cheveux sur ce problème depuis plusieurs jours et là, je suis à bout.
Ca à l'air long mais c'est très simple à comprendre.

Je prends un exemple plus simple que ce que j'ai réellement afin de faciliter la compréhension.

Imaginons que l'on veuille faire un recensement de la population dans le monde.
Pour cela, j'ai une partie d'administration où je peux ajouter des continents, puis des pays (qui appartiennent à des continents), puis des villes (qui appartiennent à des pays, qui eux-mêmes appartiennent à des continents).

A chaque fois que j'ajoute l'une de ces données (un continent, un pays, ou une ville), une nouvelle table, que nous appèlerons tbl_population incrémente ces données dans la table.
Par défaut, la population est égale à 0.

Ensuite, il y a une partie d'insertion des données.
On se rapproche du problème.
Sur cette page, je génère un tableau en fonction de tbl_population avec un champ par donnée. Ce qui donne quelque chose comme ceci :
Europe 0
| France 0
| Paris 0
| Lille 0
| Lyon 0
| Espagne 0
| Madrid 0
| Barcelone 0
Afrique 0
| Afrique du Sud 0
| Pretoria 0
| Le Cap 0
| Ghana 0
| Accra 0
Etc...

L'idée est que tous les champs de niveaux 1 et 2 (c'est-à-dire les continents et les pays) soient 'disabled'.
Ainsi, en ne saisissant que les populations des villes, on obtient les totaux par pays, puis par continent.
Et c'est là que mon problème apparaît.

Je ne sais pas comment dire par exemple que population_france = population_paris + population_lille + population_lyon.

N'hésitez pas si vous manquez d'informations.

Cdt

Posté : 25 avr. 2006, 17:55
par Ryle
A priori je dirais qu'il faut te constituer un tableau associatif reprenant la structure entre tes éléments (c'est peut être déjà ce que tu as fait) et de le parcourir à l'aide de while ou foreach imbriqués :

Ton tableau devrait ressembler à ceci :
$tab = array (
	"Europe" => array(
		"France" => array(
			"Paris" => 0,
			"Lille" => 0, 
			"Lyon" => 0),
		"Espagne" => array(
			"Madrid" => 0,
			"Barcelone" => 0),
		...),
	"Afrique" => array(
		"Afrique du Sud" => array(
			...),
	...)
	)
)

Il te faut donc parcourir chaque niveau un par un :
while(list($continentName, $continentTab) = each($tab)) {
  $continentNb= 0;
  while(list($paysName, $paysTab) = each($continentTab)) {
    $paysNb= 0;
    while(list($villeName, $villeNb) = each($paysTab)) {
      $continentNb+=$villeNb;
      $paysNb+=$villeNb;
      echo $villeName ."=". $villeNb;
    }
    echo $paysName ."=". $paysNb;
  }
  echo $continentName ."=". $continentNb;

}
Bon là l'inconvénient, c'est que ca va te l'afficher à l'envers, mais au lieu d'afficher tu peux stocker les cumuls dans une variables, voire préparer une chaine en concaténent les clés et valeurs, et ne l'afficher qu'après :)

C'est ptet pas la meilleure solution, mais c'est celle qui m'est venue ;)

Posté : 25 avr. 2006, 18:03
par nougitch
Salut Ryle,

Je te remercie d'avoir pris la peine de lire mon bloc.
Je vais étudier ce que tu me proposes et te tiens au courant de son succès, ou non :-(

A très vite.

Posté : 25 avr. 2006, 18:11
par nougitch
Pour information, ce que j'avais fait au niveau de l'affichage du tableau :

Je fais une boucle qui extrait tout ce qu'il y a dans la table tbl_population
Si c'est du niveau 1
J'affiche les éléments du niveau 1 (continents)
Si c'est du niveau 2
J'affiche les éléments du niveau 2 (pays)
Si c'est du niveau 1
J'affiche les éléments du niveau 3 (villes)

Et pour chaque donnée, je créé un champ avec un nom dynamique du genre <input type=text" name="niveau1-continent1-pays2-ville1">

En récupération, je refais une boucle qui va tous sélectionner et qui va composer tous les cas possibles.
Ensuite, je récupère ma valeur avec le $_POST['niveau1-continent1-pays2-ville1'] de la boucle.

Posté : 25 avr. 2006, 18:32
par cortex007
Salut la compagnie, pour ce probleme je pense qu'une bonne maniere de voir le probleme est d'utiliser comme tu le fait des tableaux imbrique et d'utiliser des fonction de type array_walk array_summ

:arrow: Le truc est de declarer un tableau de type : Continent= array (nation1,nation2,...,nation n))
avec nation qui est lui meme un tableau ect ....
:arrow: Apres il suffit de declarer une fonction de sommation d'elements de tableau( a condition de que les tableau contienent des la population des elements conserne), ce seras une fonction utilisateur avec 2 entrees qui devras utiliser array_summ
:arrow: Puis il faut utiliser cette fonction avec array_walk de maniere a creer une fonction recursive si possible :) pour eviter les boucles