explode et boucle foreach et for

Eléphanteau du PHP | 30 Messages

28 nov. 2006, 10:56

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:

ViPHP
ViPHP | 3607 Messages

28 nov. 2006, 11:00

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:

Eléphant du PHP | 152 Messages

28 nov. 2006, 11:01

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. @+

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

28 nov. 2006, 11:03

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 ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphanteau du PHP | 30 Messages

28 nov. 2006, 11:04

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:
Modifié en dernier par Sh4Dow le 28 nov. 2006, 11:08, modifié 1 fois.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

28 nov. 2006, 11:07

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 ! ;)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 30 Messages

28 nov. 2006, 11:12

Okay ! Merci. Je comprends mieux maintenant !
Merci pour les réponses et la rapidité :wink:

Eléphant du PHP | 152 Messages

28 nov. 2006, 11:15

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

ViPHP
ViPHP | 3607 Messages

28 nov. 2006, 11:20

à 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' )

Eléphanteau du PHP | 30 Messages

28 nov. 2006, 11:22

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:

ViPHP
ViPHP | 3607 Messages

28 nov. 2006, 11:27

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 )

Eléphanteau du PHP | 30 Messages

28 nov. 2006, 11:32

Oui merci beaucoup ! C'est bien le résultat souhaité. :D

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

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

28 nov. 2006, 11:35

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>"; 
  }
}
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

ViPHP
ViPHP | 3607 Messages

28 nov. 2006, 11:36

\: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 ?

Eléphanteau du PHP | 30 Messages

28 nov. 2006, 11:43

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:
Modifié en dernier par Sh4Dow le 28 nov. 2006, 11:57, modifié 3 fois.