Foreach en boucle

- - Dernière réponse : jordane45
Messages postés
23610
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
14 décembre 2018
- 13 juin 2017 à 23:03
Bonjour,

voilà j'ai des foreach en boucle, mais avec toujours le même code dedans.
Voici l'exemple de 3 niveaux.
Je souhaiterais pouvoir le boucler pour avoir qu'une fois le code mais pouvoir le répéter 15 fois si je veux

Avez-vous vous une idée pour boucler ça :

										// LEVEL 2
// -------------------------------------------------------------------------------------------------------------------------------------------------------
						$z++;
						foreach ($var[$nb_niveau-$z] as $pouet) {
						$nb_pers_[$z]++;
						
							if($nb_pers_[$z] <= $var[$nb_niveau-($z-1)][$nb_pers_affich_[($z-1)]][4]){
								$nb_pers_affich_[$z]++;
								$membre = AffichMembre($z, $var, $nb_niveau, $nb_pers_affich_[$z]);
								echo $membre;

								if($var[$nb_niveau-$z][$nb_pers_affich_[$z]][4] == 0){
									echo "</li>";
								}
								else{
									echo '<span class="oc" title="Cliquer pour ouvrir le niveau suivant"></span>';
									echo '<ul id="Nested-'.$var[$nb_niveau-$z][$nb_pers_affich_[$z]][6].'">';									// LEVEL 3
// -------------------------------------------------------------------------------------------------------------------------------------------------------
										$z++;
										foreach ($var[$nb_niveau-$z] as $pouet) {
										$nb_pers_[$z]++;
										
											if($nb_pers_[$z] <= $var[$nb_niveau-($z-1)][$nb_pers_affich_[($z-1)]][4]){
												$nb_pers_affich_[$z]++;
												$membre = AffichMembre($z, $var, $nb_niveau, $nb_pers_affich_[$z]);
												echo $membre;

												if($var[$nb_niveau-$z][$nb_pers_affich_[$z]][4] == 0){
													echo "</li>";
												}
												else{
													echo '<span class="oc" title="Cliquer pour ouvrir le niveau suivant"></span>';
													echo '<ul id="Nested-'.$var[$nb_niveau-$z][$nb_pers_affich_[$z]][6].'">';					// LEVEL 4
// -------------------------------------------------------------------------------------------------------------------------------------------------------
														$z++;
														foreach ($var[$nb_niveau-$z] as $pouet) {
														$nb_pers_[$z]++;
														
															if($nb_pers_[$z] <= $var[$nb_niveau-($z-1)][$nb_pers_affich_[$z-1]][4]){
																$nb_pers_affich_[$z]++;
																$membre = AffichMembre($z, $var, $nb_niveau, $nb_pers_affich_[$z]);
																echo $membre;

																if($var[$nb_niveau-$z][$nb_pers_affich_[$z]][4] == 0){
																	echo "</li>";
																}
																else{
																	echo '<span class="oc" title="Cliquer pour ouvrir le niveau suivant"></span>';
																	echo '<ul id="Nested-'.$var[$nb_niveau-$z][$nb_pers_affich_[$z]][6].'">';																							
// -------------------------------------------------------------------------------------------------------------------------------------------------------

// -------------------------------------------------------------------------------------------------------------------------------------------------------
																	echo "</ul></li>";
																}
															}
															$nb_pers[$z+1] = 0;
														}
														$z--;																				// FIN LEVEL 4
// -------------------------------------------------------------------------------------------------------------------------------------------------------
													echo "</ul></li>";
												}
											}
											$nb_pers_[$z+1] = 0;
										}
										$z--;																								// FIN LEVEL 3	
// -------------------------------------------------------------------------------------------------------------------------------------------------------
									echo "</ul></li>";
								}
							}
							$nb_pers_[$z+1] = 0;
						} 
						$z--;																												// FIN LEVEL 2
// -------------------------------------------------------------------------------------------------------------------------------------------------------


Merci
Afficher la suite 

Votre réponse

2 réponses

Messages postés
23610
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
14 décembre 2018
0
Merci
Bonjour,

Tu sembles vouloir faire du récursif...

Pour pouvoir te répondre il faudrait que nous sachions à quoi ressemblent les données en entrée.
Donc si tu pouvais, avant ta première boucle faire un
echo "<pre>";
print_r($var):
echo "</pre>";

et nous en afficher le résultat ......


Commenter la réponse de jordane45
0
Merci
Bonjour je veux bien faire un print_r mais ça va être imbuvable :-D

en gros voilà, c'est pour un projet de génération automatique d'arbre généalogique (d'où le côté récursif) à X niveaux, X étant variable.

je mets toutes les personnes de l'arbre et leur infos dans un array $var

$var est un array à 3 dimensions

$var[$niveau][$qui][$infos]

$niveau : le niveau de l'arbre
$qui : chaque personne du niveau $niveau
$infos : toutes les infos de la personne $qui du niveau $niveau

$infos[0] = Nom du membre
$infos[1] = Nom de l'époux
$infos[2] = Sexe de l'époux (uniquement pour pouvoir conjugé époux/épouse)
$infos[3] = Occupation / Travail du membre
$infos[4] = Nombre d'enfants (pour les calculs d'affichage)
$infos[5] = Nom de la photo du membre pour affichage vignette
$infos[6] = ID du membre

par exemple :

$var[6][0] = array(
"Grand Grand Papi",
"Grand Grand Mamie",
"Femme",
"Entrepreneur en Maconnerie",
"2",
"default_m.jpg",
"1"
);

$var[5][0] = array(
"Grand Papi 1",
"Grand Mamie 1",
"Femme",
"Charpentier",
"1",
"default_m.jpg",
"2"
);

$var[5][1] = array(
"Grand Papi 2",
"Grand Mamie 2",
"Femme",
"Brocanteur",
"2",
"default_m.jpg",
"3"
);

Ensuite une fois $var définit

// Comptage du nb de niveaux
$nb_niveau = count($var) - 1;


// Déclaration des variables
for ($k=$nb_niveau; $k >= 2 ; $k--) {
$nb_pers_[$k] = 0;
$nb_pers_affich_[$k] = -1;
}

$z = 0;

// Déclaration des fonctions
function AffichMembre($z_f, $var_f, $nb_niveau_f, $qui_f){

if($var_f[$nb_niveau_f-$z_f][$qui_f][2] == 'Homme'){
$marriage = '(époux '.$var_f[$nb_niveau_f-$z_f][$qui_f][1].')';
} elseif($var_f[$nb_niveau_f-$z_f][$qui_f][2] == 'Femme') {
$marriage = '(épouse '.$var_f[$nb_niveau_f-$z_f][$qui_f][1].')';
} else {
$marriage = NULL;
}


$affich = '
<li title="Cliquer pour dévoiler plus d\'informations">
<a class="tips" href="#" rel="nofollow noopener noreferrer" target="_blank" id="trigger_Nested-'.$var_f[$nb_niveau_f-$z_f][$qui_f][6].'">
<img src="../Images/profil/'.$var_f[$nb_niveau_f-$z_f][$qui_f][5].'" class="photo_membre"><br />
<strong>'.$var_f[$nb_niveau_f-$z_f][$qui_f][0].'</strong> '.$marriage.'<br />
<span class="italic">'.$var_f[$nb_niveau_f-$z_f][$qui_f][3].'</span></a>
';

return $affich;
}


Et ensuite la génération de l'arbre avec le code que j'ai mis en exemple dans mon premier post.

Ce script fonctionne bien, mais il faut que j'écrive les 15 niveaux si j'en veux 15 par exemple

j'ai réussi donc à "variabiliser" tout mon script de sorte que ce soit le même à chaque niveau dans le but de le boucler par la suite ... mais là je sèche

merci
jordane45
Messages postés
23610
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
14 décembre 2018
-
Je n'ai pas la tête à lire tout ton code (surtout que tu ne l'as pas mis via les balises de code......)..

Mais donc.. il te faut du récursif ...

En général... on class un array hierarchique par l'ID de l'élémént et l'ID parent .... par juste par niveau...

Je pense qu'un retraitement de ton array ne serait pas superflu pour le remettre en forme avant d'attaquer l'affichage pour obtenir un truc du genre

Array(
[name] => 'Hemiptera'
[children] => Array(

[0] => Array(
[name] => 'Miridae'
[children] => Array(

[0] => Array(
[name] => 'Kanakamiris'
[children] => Array(
)
)
[1] => Array(
[name] => 'Neophloeobia'
[children] => Array(

[0] => Array(
[name] => 'incisa'
[children] => Array(
)
)
)
)
)
)
[1] => Array(
[name] => 'Noridae'
[children] => Array(

[0] => Array(
[name] => 'Canelbia'
[children] => Array(

[0] => Array(
[name] => 'Arissa'
[children] => Array(
)
)
)
)
)
)
)
)


Tu peux t'inspirer du code disponible ici (à adapter à tes besoins bien entendu...)
http://www.commentcamarche.net/forum/affich-34583547-listing-recursif#4


Au cas où tu n'y arriverai pas .. je pourrais peut-être t'aider à condition que :
- Tu me fournisses un array d'exemple (un peu plus complet que ton exemple actuel...)
- L'exemple de ce que tu veux en sorti (en utilisant les balises de code cette fois ) => je veux parler du résultat (de ton code actuel sur 4 niveaux...) dans ton navigateur (le code source généré )



NB : Les balises de code : http://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code

.
Commenter la réponse de joebuz

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.