Foreach() et explode() : problème de récupération des données

Petit nouveau ! | 3 Messages

18 nov. 2008, 22:12

Bonjour,

Je veux récupérer les cases à cocher d'un formulaire. J'ai suivi ce tuto. Voilà mon code :

Formulaire html

Code : Tout sélectionner

<form method="post" action="./foreach_test.php"> <input type="checkbox" name="prg[]" id="labelbox0" value="prg0 +++ nom du prg0" /> <label for="labelbox0">PRG0</label> <br /> <input type="checkbox" name="prg[]" id="labelbox1" value="prg1 +++ nom du prg1" checked="checked" /> <label for="labelbox1">PRG1</label> <br /> <input type="checkbox" name="prg[]" id="labelbox2" value="prg2 +++ nom du prg2" checked="checked" /> <label for="labelbox2">PRG2</label> <br /> <input type="checkbox" name="prg[]" id="labelbox3" value="prg3 +++ nom du prg3" checked="checked" /> <label for="labelbox3">PRG3</label> <br /> <input type="checkbox" name="prg[]" id="labelbox4" value="prg4 +++ nom du prg4" /> <label for="labelbox4">PRG4</label> <br /> <input type="checkbox" name="prg[]" id="labelbox5" value="prg5 +++ nom du prg5" /> <label for="labelbox5">PRG5</label> <br /> <input type="submit" value="Envoi" /> </form>
et la récup
<?php
	$Res = (isset($_POST['prg'])) ? $_POST['prg'] : null;
	echo "Résultats : <br />";
	if ( !empty($Res) ) {
		foreach( $Res as $key => $value ) {
			echo 'N°'.$key.' : '.$value.'<br>';
			//echo 'value ' . $key . ' = '.$value . '<br />';
			
			$valueTab = array(); // tableau pour stocker les valeurs
			$pattern = ' +++ ';
			$valueExplode = explode($pattern, $value); // on explose la chaine
			$valueTab[] = $valueExplode; // on met la valeur dans le tableau
			//echo $valueTab[$key].'<br>';
			
		}
	} else echo 'KO';
?>
Je voudrais couper avec la fonction explode() chaque chaine $value, et stocker les valeurs dans un tableau. Seulement je n'y arrive pas, j'ai l'impression que la dernière valeur du foreach() écrase les autres, sans pouvoir toutes les récupérer. Et je ne vois pas quelle est mon erreur dans le code ci-dessus...

Merci pour votre aide !


Edit 19/11 : résolu, le tableau doit être initialisé en dehors du foreach()
Modifié en dernier par Jarodd le 19 nov. 2008, 10:39, modifié 2 fois.

ViPHP
ViPHP | 1136 Messages

18 nov. 2008, 22:39

Salut ,

En partant du principe ou
explode($pattern, $value); // on explose la chaine 
fonctionne ( car on ne connait pas $value ... )

la commande explode retourne toujours un tableau ...

Ta ligne de test
//echo $valueTab[$key].'<br>';
n'a donc pas vraiment de sens ici .

tout à la fin de tes lignes , fais un
var_dump($valueTab);
Tu devrais voir apparaître , tous les résultats de l'explode ..

Apres , à toi de les organiser comme tu le souhaites ...

cdt,
Christophe

Petit nouveau ! | 3 Messages

18 nov. 2008, 23:11

Bonsoir,

J'ai ceci en retour :
array(1) { [0]=>  array(2) { [0]=>  string(4) "prg5" [1]=>  string(11) "nom du prg5" } } 
C'est encore la dernière donnée qui est parsée dans le foreach(), les précédentes sont écrasées, et je ne comprend pas pourquoi.
( car on ne connait pas $value ... )
$value est dans le foreach : foreach( $TabPrg as $key => $value )

Et ce value a bien la même valeur que l'attribut de l'input. Ou alors il y a quelque chose qui m'échappe ?

Eléphant du PHP | 353 Messages

18 nov. 2008, 23:49

En fait...
C'est tout à fait normal..

Regarde ceci :
        foreach( $Res as $key => $value ) {
            echo 'N°'.$key.' : '.$value.'<br>';
            //echo 'value ' . $key . ' = '.$value . '<br />';
            
            $valueTab = array(); // tableau pour stocker les valeurs
            $pattern = ' +++ ';
            $valueExplode = explode($pattern, $value); // on explose la chaine
            $valueTab[] = $valueExplode; // on met la valeur dans le tableau
            //echo $valueTab[$key].'<br>';
            
        } 
Si tu regarde bien, tu initialise ton tableau $valueTab à chaque boucle au lieu de ne le déclarer qu'une fois en dehors de la boucle.

Voici ce qu'il se passe

Pour chaque boucle :
- Tu déclare le tableau (ce qui supprime les anciennes données)
- Tu le remplis.

Pour que cela fonctionne fait comme ceci :
$valueTab = array(); // tableau pour stocker les valeurs
foreach( $Res as $key => $value ) { 
           
$pattern = ' +++ ';
$valueExplode = explode($pattern, $value); // on explose la chaine
$valueTab[] = $valueExplode; // on met la valeur dans le tableau
            
} 

Petit nouveau ! | 3 Messages

19 nov. 2008, 10:37

Bonjour,

Effectivement c'est une belle erreur de débutant :oops:

Le résultat est un tableau à deux dimensions, obtenu avec var_dump() comme l'a dit Stopher. Pour afficher chaque ligne isolée, j'ai fait comme ceci :
$nb_prg = $key + 1; // +1 car on commence à l'indice 0
echo 'Nombre de programmes : ' . $nb_prg . '<br />';
for ($i = 0; $i < $nb_prg; $i++ ) {
	for ($j = 0; $j <= 1; $j++ ) { // on a 2 valeurs dans le 2e tableau
		echo $valueTab[$i][$j].'<br>';
	}
}
Je ne sais pas si c'est correct, peut-être voyez-vous comment l'améliorer ?

En tout cas le problème initial est résolu, merci à vous deux !