Boucles imbriquées avec des arrays de longueur différentes

Eléphant du PHP | 139 Messages

20 janv. 2009, 01:59

Bonsoir,

Toujours sur le thème des arrays et de boucles imbriquées, j'ai un autre problème.

Une première boucle while pour les 6 premier mois de l'année (1 semestre)
Une deuxième boucle while pour le nombre de jours du mois.
Jusqu'ici rien de compliqué.

A chaque jour correspond un texte (récupéré via formulaire)
Par exemple:
$text_mois1 est un array qui contient 31 elements "texte" correspondant au mois de janvier
$text_mois2 est un array qui contient 28 elements "texte" correspondant au mois de février
etc...
Ces différents array sont englobés dans le tableau $champ_name.
Avec echo $champ_name[$mois], j'affiche le texte qui correspond à chaque jour de chaque mois du semestre.

Voici, mon petit souci, lorsque, lorsque j'exécute ce bout de code, des message d'erreurs apparaissent.
Notice: Undefined offset: 28 in...
Notice: Undefined offset: 29 in...

Cela parce que les tableaux $text_mois1, $text_mois2,... n'ont pas de même longueur (ne contiennent pas le même nombre d'éléments).
$text_mois1[$day] boucle sur 31 jours (31 éléments et pas de souci), mais $text_mois2[$day] qui contient 28 éléments, boucle également sur 31 jours ( et affichage des messages d'erreurs, cités plus haut).

Pour éviter ce problème, je complète les tableaux $text_mois, par des éléments vide, pour qu'ils aient tous la même longueur (31 éléments).
Mais, vous en doutez, c'est un bricolage de deux sous...

Voilà, je suis à l'écoute de toutes propositions ou améliorations.
$mois=0;
while($mois<6){
	$date_jour1_mois= mktime(0,0,0,$mois1+$mois,1,$annee);
	$nb_jour_mois=date('t',$date_jour1_mois);
		
	$day=0;
	while( $day<$nb_jour_mois){		
		$champ_name=array($text_mois1[$day],$text_mois2[$day],$text_mois3[$day],$text_mois4[$day],$text_mois5[$day],$text_mois6[$day]);				
		echo $champ_name[$mois]	;
   		
   $date_jour1_mois=mktime(0,0,0,$mois1_semestre_sess+$mois,1+$day,$annee_trimestre_sess);
		
    	$day++;    	
	}
	$mois++;	
}

ViPHP
ViPHP | 2287 Messages

20 janv. 2009, 09:50

Hello,

Les erreurs de type Notice: Undefined offset: peuvent se régler avec un
if(isset($tableau[$cle])) {
  // Ici le code utile qui manipule $tableau[$cle]
}
array_key_exists() peut jouer le même rôle, mais il ne s'applique qu'aux tableaux. isset() a l'avantage d'être universel.

Je pense que dans ton cas c'est la correction la plus simple car tu ne peux pas deviner le nombre de jours en connaissant seulement le mois correspondant, à cause des années bissextiles : le mois de février peut avoir 28 ou 29 éléments selon l'année... :)
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Eléphant du PHP | 139 Messages

20 janv. 2009, 15:09

Merci de ta Réponse Calimero, mais, je n'ai pas vraiment compris ta proposition et je ne suis pas certain que cela répond au problème.


Exemple1 d'itération:
Pour $mois=1 (février)
$nb_jour_mois=28
Dernière boucle de $day=27
[php]
$champ_name=array($text_mois1[27],$text_mois2[27],$text_mois3[27],$text_mois4[27],$text_mois5[27],$text_mois6[27]);
[/php]
Pas de problème pour les $text_mois

Exemple2 d'itération:
Pour $mois=2 (mars)
$nb_jour_mois=31
Dernière boucle de $day=30
[php]
$champ_name=array($text_mois1[30],$text_mois2[30],$text_mois3[30],$text_mois4[30],$text_mois5[30],$text_mois6[30]);
[/php]
Pb, erreurs de type Notice: Undefined offset pour tous les $text_mois qui n'ont pas 30 éléments.

Je ne vois pas comment employer array_key_exists() pour chaque $text_mois.
Je souhaite si possible de faire un traitement trop coûteux en terme de performance.

Eléphant du PHP | 139 Messages

22 janv. 2009, 01:05

Je relance le post, car, j'aimerais vraiment pouvoir trouver une autre solution.
Cela m'éviterais de faire appel à chaque fois au code bricolé que j'ai trouvé pour palier à ce souci.
Et pour l'instant, je ne vois pas d'autres alternatives...
Désolé pour le up! :-(((


Après une recherche dans la doc de php, j'ai résolu mon souci.
En fait, j'avais des lacunes concernant les tableaux multidimensionnels.

Le code de départ:
[php]
$champ_name=array($text_mois1[$day],$text_mois2[$day],$text_mois3[$day],$text_mois4[$day],$text_mois5[$day],$text_mois6[$day]);
echo $champ_name[$mois] ;
[/php]

Devient:
[php]
$champ_name=array($text_mois1,$text_mois2,$text_mois3,$text_mois4,$text_mois5,$text_mois6);
echo $champ_name[$mois][$day] ;
[/php]

Et hop! le tour est joué :-)))))