Foreach en boucle

joebuz - 13 juin 2017 à 00:01
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 - 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

2 réponses

jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 344
13 juin 2017 à 00:34
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 ......


0
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
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 344
13 juin 2017 à 23:03
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

.
0
Rejoignez-nous