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

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Foreach() et explode() : problème de récupération des données

par Jarodd » 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 !

par yaug » 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
            
} 

par Jarodd » 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 ?

par stopher » 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

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

par Jarodd » 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()