Page 1 sur 2

explode et boucle foreach et for

Posté : 28 nov. 2006, 10:56
par Sh4Dow
Hello tout le monde !
Je fais un appel à votre aide car j'ai un tout petit problème de rien du tout mais qui m'empêche d'avancer.

Voila, je récupère les valeurs de cases à cocher de cette manière :
$res_info = (isset($_POST['res_info']))?$_POST['res_info']:null; 
J'affiche toutes les valeurs de $res_info pour tester, tout va bien ! Il y a bien quelque chose (ouf, déjà ça).

En suite, je passe en revue chaque valeur du tableau pour récupérer précisément chaque élément :
//on passe en revue chaque élément du tableau $res_info s'il n'est pas vide
			if (!empty($res_info)) {
				//pour chaque élément, la valeur de $res_info va dans $valeur et l'indexe est représenté par $cle
    			foreach($res_info as $cle => $valeur) {
        			echo $cle.' : '.$valeur.'<br>';
					/*on récupère chaque éléments de $valeur de manière séparée (4 au total)
					avec la fonction explode. Le delimiter est "|" */
					$reservation = explode("|",$valeur);
    			}		
			} 
			//si $res_info est vide
			else {
				echo "vide";
			}
Ensuite, pour tester que tout c'est bien déroulé avant d'aller plus loins, je souhaite afficher chacune des valeurs qui sont sorties. Je le fais de la manière suivante :
for ($z=0 ; $z<8 ; $z++){
				echo $reservation[$z]; 
				echo "<br>";
			 }
Et là, c'est magnifique, l'erreur que voici est générée :
Notice: Undefined offset: 4 in c:\program files\easyphp1-8\www\eps\visiteur\grille\confirmation_reservation.php on line 175 etc.

J'avoue ne pas comprendre ! Pourquoi offset ? Et pourquoi l'affichage des mes élèments ne commence seulement qu'à partir de la dernière valeur récupérée ?

Pouvez-vous me venir en aide ? J'en serais reconnaissant.

Merci d'avance !

a+ :wink:

Posté : 28 nov. 2006, 11:00
par jojolapine
tou d'abord à quoi ressemble le contenu de ton tableau $res_info?
ensuite, le contenu de ton ta variable $reservation est écrasée chaque itération du foreach, donc c'est normal que puisse avoir un petit soucis
en attente de plus d'infos :wink:

re

Posté : 28 nov. 2006, 11:01
par Frantz
Tu peux faire ça par exemple :

Code : Tout sélectionner

$nb=count($reservation); for ($z=0 ; $z<$nb ; $z++){ echo $reservation[$z]; echo "<br>"; }
Si tu as moins de 4 objets dans ton tableau "reservation".
C'est normal qu'il ne trouve pas le 4ème que tu essais d'appeler.

Test ça. @+

Posté : 28 nov. 2006, 11:03
par zeus
Le message d'erreur signifie que tu essayes d'acceder à des cases de ton tableau qui n'existes pas. Voilà pourquoi "Indefinded index at offset ..." ;)

Je pense que l'erreur se situe dans ta boucle for. Qu'est-ce qui te permet de t'assurer que tu as 8 cases ? Est-ce que le explode('|' ...) fonctionne comme tu le veux ?

Petit conseil, une fois que tu as rempli ton tableau $reservation, essaye d'afficher son contenu avec print_r($reservation) afin de vérifier qu'il contient bien ce que tu veux ;)

Posté : 28 nov. 2006, 11:04
par Sh4Dow
Ok merci, je vais essayer.

Pour infos, mon tableau est récupère d'une page php précédante. Les valeurs proviennent de checkboxes. Cela ressemble à ceci :
value="<?php echo $jour[$z]."|".$row_periodes['per_num']."|".$sal_num."|".$gro_num; ?>"
Donc lorsqu'on affiche ceci à l'écran, on obtient quelque chose qui correspond à cela :
2006-11-12|5|10|2

edit : effectivement, le contenu de mon tableau $reservation à l'air d'être écrasé à chaque passage de la boucle foreach(). Mais pourquoi ? :shock:

Posté : 28 nov. 2006, 11:07
par Ryle
Concernant ton tableau, c'est effectivement parce que s'il ne contient que 4 éléménts d'après ce que tu dis, tu vas difficilement pouvoir interroger les index de 0 à 8 ;)

La méthode de Frantz est bien pour cela, car elle t'assure de ne pas dépasser la longueur du tableau :) Image
Et pourquoi l'affichage des mes élèments ne commence seulement qu'à partir de la dernière valeur récupérée ?
Tout simplement parce que tu fais ton affichage en dehors du foreach() et qu'à chaque itération la valeur de $reservation est écrasée par la nouvelle. Du coup une fois sorti de la boucle, elle n'a plus pour valeur que la dernière :)

Edit : pour une fois que je peux coller mon joli maccaron ! ;)

Posté : 28 nov. 2006, 11:12
par Sh4Dow
Okay ! Merci. Je comprends mieux maintenant !
Merci pour les réponses et la rapidité :wink:

re

Posté : 28 nov. 2006, 11:15
par Frantz
Tu te compliques la vie, la boucle foreach qui tourne sur
ton tableau res_info fait exactement la même chose que ce que
tu veux faire plus loin.

Je m'explique : le contenu du tableau que t'essais de créer
est le même que celui dénommé $res_info.

Tu peux donc faire, si ça t'amuses :
$nb=count($res_info); 
for ($z=0 ; $z<$nb ; $z++){ 
                echo $res_info[$z];  
                echo "<br>"; 
             }
Voila, j'espère avoir été clair ??

@+ et bon courage

Posté : 28 nov. 2006, 11:20
par jojolapine
à non, la il y a une différence entre le tableau $res_info et le tableau ^reservation...
un exemple de print_r que cela pourrait générer...
$res_info

Code : Tout sélectionner

array( [0]=>'2006-11-12|5|10|2', [1]=>'2006-12-11|8|10|2', ... )
et le tableau $resrevation:

Code : Tout sélectionner

array( [0]=>'2006-11-12', [1]=>'5', [2]=>'10', [3]=>'2' )

Posté : 28 nov. 2006, 11:22
par Sh4Dow
Oui effectivement. Mais en faite, je fais un explode() dans le but de récupéré chaque éléments de la valeur de $res_info à l'index courant. Ceci dans le but d'effectuer une requête par la suite (ajout de valeur dans la base de données).

Et vu que l'utilisateur a ici la possiblité d'effecteur une ou plusieurs réservations d'un seul coup, c'est cela qui me pose problème.

edit : exactement ce que je veux faire jojolapine :wink:

Posté : 28 nov. 2006, 11:27
par jojolapine
tu pourrais faire ceci:
tu initialise au tout début ton tableau $reservation, comme ceci:
$reservation = array();
et dans ta boucle, tu ceci:
foreach($res_info as $cle => $valeur) {
                    echo $cle.' : '.$valeur.'<br>';
                    /*on récupère chaque éléments de $valeur de manière séparée (4 au total)
                    avec la fonction explode. Le delimiter est "|" */
                    array_push($reservation ,explode("|",$valeur));
                } 
normalement un print_r de $reservation devrait te donner:

Code : Tout sélectionner

array( [0]=>array( [0]=>'2006-11-114? [1]=>'5', [2]=>'10', [3]=>'2' ) [1]=>etc )

Posté : 28 nov. 2006, 11:32
par Sh4Dow
Oui merci beaucoup ! C'est bien le résultat souhaité. :D

Maintenant, ne reste plus qu'à construire la requête :wink:

Posté : 28 nov. 2006, 11:35
par Ryle
Personnellement ça me semble plus simple de traiter directement tes données quand tu les as que de les stocker dans un tableau que tu vas devoir reparcourir ensuite. Pourquoi ne pas simplement imbriquer ton for() dans ton foreach() ? :)
foreach($res_info as $cle => $valeur) { 
  $reservation = explode("|",$valeur); // split des élément

  // pour chacun des éléments du tableau $reservation
  for ($z=0 ; $z<count($reservation) ; $z++){ 
    // affichage, insertion en base ou ce que tu veux :)
    echo $reservation[$z] . "<br>"; 
  }
}

Posté : 28 nov. 2006, 11:36
par jojolapine
\:D/ This answer is User approved
[-( Rabat joie Ryle
Non plus sèrieusement Sh4dow, c'est vrai que c'est plus simple, sauf, si tu utilises des requêtes préparées ?

Posté : 28 nov. 2006, 11:43
par Sh4Dow
Oui, j'ai aussi fini par adopter la solution de Ryle. :D

Requêtes préparées ? Dans le genre Dreamweaver ? Si c'est ça, alors non ^^ J'ai déjà donné. Et la requête est trop complexe pour être générée automatiquement par Dreamweaver. Pour moi, la meilleure solution sera toujours de les faire à la main.

edit : en faite, je me posais une autre question (et oui, le topic ne peut pas s'arrêter en si bon chemin non ? :wink: ) :
Serait-il possible de faire la même chose avec un tableau à plusieurs dimensions ? Car le problème qui va se poser ensuite sera de récupérer les valeurs correctement pour effectuer la requête.
En effet on peut considérer ceci : les index 0,1,2,3 vont ensemble, puis 4,5,6,7 etc.

Donc la réservation r1 pour la date 0 à la période 1 dans la salle 2 avec le groupe 3
Puis réservation r2 pour la date 4 à la période 5 etc...

Est-ce que cela serait correcte ou suis-je à côté de la plaque ?
:roll: