Suppression de valeurs dans un tableau multidimensionnel

Suppression de valeurs dans un tableau multidimensionnel - PHP - Programmation

Marsh Posté le 12-01-2009 à 08:45:19    

Bonjour à tous,
 
Je cherche à créer un texte à trous à partir des fichiers SUJET.php et CORRECTION.php
Dans SUJET.php, je réalise un tirage au sort de valeurs issues d'un tableau multidimensionnel, affiche ces valeurs (avec les trous), que j'envoie ensuite à CORRECTION.php
Mon problème est le suivant : A chaque nouveau passage dans SUJET.php, je souhaite supprimer du tableau les valeurs déjà tirées au sort afin de ne pas les proposer 2 fois; je crois comprendre qu'il faut que j'utilise la fonction UNSET($_SESSION['matrice']); mais n'arrive pas à la mettre en oeuvre.
Voici un extrait de SUJET.php :
 
                            °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
// Déclaration de la matrice (tableau multidimensionnel)
 $matrice = array('element','electrons','reponse','affichage');
 $matrice[]=array('Hydrogène','1','(K)1','(K)<sup>1</sup>');
 $matrice[]=array('Hélium','2','(K)2','(K)<sup>2</sup>');
 etc.....
// Je passe $matrice en session afin de la conserver
$_SESSION['matrice']=$matrice;
// Premier passage donc il faut trier
 shuffle($_SESSION['matrice']);
// Affichage des textes à trous :
 $i=0;
 for ($numero=0;$numero<$Par;$numero++)
  {
  $i++;
  switch ($i)
   {
   case "1":
   echo '<img border="0" src="../../puce-claire.gif" width="8" height="8"> Quelle est la structure électronique de l\'élément '.$_SESSION['matrice'][$numero][0].' ('.$_SESSION['matrice'][$numero][1]. ' électrons) ? '.'<input type="text" size="30" name="r1" id="r1" class="champ" />';
   $question1 = $_SESSION['matrice'][$numero][0];
   $electrons1 = $_SESSION['matrice'][$numero][1];
   $reponse1 = $_SESSION['matrice'][$numero][2];
   $attendue1 = $_SESSION['matrice'][$numero][3];
   break;
 
   case "2":
                                       etc.
                              °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
 
Je pense donc supprimer du tableau les éléments qui ont été tirés au sort dès qu'ils sont affichés mais suis bloqué sur cette fonction UNSET($_SESSION['matrice']) Enfin sans doute quelque chose d'approchant.
Quelqu'un aurait-il l'amabilité de m'aider ?
Merci d'avance.
tete278

Reply

Marsh Posté le 12-01-2009 à 08:45:19   

Reply

Marsh Posté le 12-01-2009 à 10:15:18    

je te conseille d'utiliser array_rand : http://us2.php.net/array_rand
 
tu récupère un tableau  de clés aléatoires, genre

Code :
  1. $keys = array_rend($matrice , $nbQuestions);
  2.  
  3. foreach($keys as $key)
  4. {
  5.      $element = $matrice[$key];
  6.      //ici , je pose la question
  7.  
  8. }


 
par contre, je comprends pas trop la raison du switch


---------------

Reply

Marsh Posté le 12-01-2009 à 12:57:03    

Bonjour flo850,
 
Merci pour ton intervention rapide et ta proposition que je vais tester.
La présence de switch réside dans le fait que je sélectionne 5 éléments et ce sont ceux-ci que j'affiche et je récupère en même temps des valeurs différentes R1, r2, etc. des réponses données.

Reply

Marsh Posté le 12-01-2009 à 13:26:08    

Pour flo850,
 
Même si ta proposition venait à fonctionner (chose que je n'ai pas eu le temps de vérifier), elle ne permet pas, sauf erreur de ma part, de supprimer certains éléments comme je le recherche.

Reply

Marsh Posté le 12-01-2009 à 17:58:37    

Si, mais il faut que tu réfléchisses : dans le foreach, $key vaut la clé choisie donc :

Code :
  1. unset($matrice[$key]);


Le problème qui reste c'est : comment faire pour ne pas avoir plusieurs fois le même élément ? Mais pour çà je ne saurais te répondre.

Reply

Marsh Posté le 12-01-2009 à 22:38:07    

avec le tirage aléatoire, tu aura chaque clé une seule et unique fois , donc, si je comprends bine le problème, tu n'aura plus besoin de unset , et tu gardes en session  la liste de toutes tes données

 


et dans ton formulaire, tu passe juste le numéro de la question avec la réponse de l'utilisateur

Code :
  1. $idQuestions= array_rand($matrice , $nbQuestions);
  2.  
  3.  
  4. ?>
  5. <form action="tapagedetraitement.php" method="post">
  6. <ul class="mesquestions"l> <!-- pour pouvoir styler tes li facilement -->
  7. <?
  8. $cpt = 0 ;
  9. for ($cpt = 0 ; $cpt < sizeof($idQuestions) ; $cpt ++)
  10. {
  11.      $idQuestion = idQuestions[$cpt];
  12.      $element = $matrice[$key];
  13.      //ici , je pose la question
  14.      echo '<input type="hidden" name="questions[]" value="'.$key.'">'; // le numero de la question
  15.  
  16.   echo '<li> Quelle est la structure électronique de l\'élément '.$_SESSION['matrice'][$key][0].' ('.$_SESSION['matrice'][$key][1]. ' électrons) ? '.'<input type="text" size="30" name="reponse['.$cpt.']"  class="champ" /></li>';
  17.  
  18. }
  19. echo'</ul>';
  20. echo'</form>';
 

si j'ai bien compris le problème

 

EDIT : en fait, j'ai mal compris

 

il te suffit , dans ta table de traitement des réponse, d'effacer avec unset , les question deja répondue

 

par contre, il faut que tfasse gaffe a ne pas reremplir le tableau a chaque fois

 


Message édité par flo850 le 12-01-2009 à 22:40:06

---------------

Reply

Marsh Posté le 13-01-2009 à 18:06:35    

Bonjour flo850,
 
Merci pour ta deuxième contribution.
 
1°) Ton code semble ne plus afficher les noms des éléments, ni leur numéro atomique car on obtient :
 
Quelle est la structure électronique de l'élément ( électrons) ?  
Quelle est la structure électronique de l'élément ( électrons) ?  
etc.
 
au lieu de :
Quelle est la structure électronique de l'élément XXX ( BBB électrons) ?  
Quelle est la structure électronique de l'élément YYY ( ZZZ électrons) ?  
 
2°) Je cherche en effectivement à utiliser la fonction UNSET mais n'arrive pas à la mettre en oeuvre. Je crois qu'il s'agit de quelque chose comme unset ($_SESSION['matrice']) mais ne trouve pas à coder de sorte que cela fonctionne.
 
Peux-tu m'aider de nouveau ?
Merci encore
tete278

Reply

Marsh Posté le 13-01-2009 à 18:15:36    

2 :
bah RTFM pour unset : http://fr.php.net/unset
D'ailleurs je t'avais donné la solution dans mon post :sarcastic:
 
Il "supprime" une variable fournie en paramètre :
 

Code :
  1. $var = '...';
  2. echo "$var<br />"; // affiche ...
  3. unset($var);
  4. echo $var; // erreur PHP : undefined variable : $var est supprimé
  5.  
  6. $array = array();
  7. $array['element'] = array();
  8. $array['element']['souselement'] = '...';
  9. unset($array['element']['souselement']);
  10. echo $array['element']['souselement']; // erreur PHP : not an offset un truc du genre : l'element souselement est supprimé
  11. print_r($array['element']); // affiche un tableau vide "Array ()" : existe mais vide

Reply

Marsh Posté le 15-01-2009 à 08:11:54    

Bonjour,
 
Pardon pour le délai mais j'ai du m'absenter sans connexion au net.
En adaptant les propositions de flo850 et luc@s, j'utilise maintenant le code suivant :
 
// Extrait du code °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
$_SESSION['matrice']=$matrice;
$idQuestions= array_rand($_SESSION['matrice'] , $Par);
echo '<form action='."membreSuite.php".' method='."post".'><ul class='."questions".'><ul>';
 
$cpt = 0 ;  
for ($cpt = 0 ; $cpt < sizeof($idQuestions) ;$cpt ++)
 {
  $key = $idQuestions[$cpt];
  $element = $_SESSION['matrice'][$key];
  echo '<input type="hidden" name="questions[]" value="'.$key.'">';
  echo '<li> Quelle est la structure électronique de l\'élément '.$_SESSION['matrice'][$key][0].' ('.$_SESSION['matrice'][$key][1]. ' électrons) ? '.'<input type="text" size="30" name="r['.$cpt.']" /></li>';
 
  $question['.$cpt.'] = $_SESSION['matrice'][$key][0];
  $electrons['.$cpt.'] = $_SESSION['matrice'][$key][1];
  $reponse['.$cpt.'] = $_SESSION['matrice'][$key][3];
  $attendue['.$cpt.'] = $_SESSION['matrice'][$key][2];
 
 
  unset ($_SESSION['matrice'][$key]);   }
?>
<input type="hidden" name="question1" value="<?php echo $question1; ?>">
<input type="hidden" name="electrons1" value="<?php echo $electrons1; ?>">
<input type="hidden" name="reponse1" value="<?php echo $reponse1; ?>">
<input type="hidden" name="attendue1" value="<?php echo $attendue1; ?>">
 
etc.
// Fin de l'extrait °°°°°°°°°°°°°°°°°°°°°°°°°°°
 
Mon code est allégé par rapport au précédent et fonctionne mais certaines lignes ne s'affichent que de façon partielle, comme par exemple ici ou la 2ème ligne est anormale.
 
Quelle est la structure électronique de l'élément Chlore (17 électrons) ?
Quelle est la structure électronique de l'élément a (f électrons) ?  
Quelle est la structure électronique de l'élément Phosphore (15 électrons) ?
 
Une âme charitable saurait-elle pourquoi ?
Cordialement,
tete278

Reply

Marsh Posté le 16-01-2009 à 12:20:40    

Bonjour à tous,
 
J'ajoute que ce problème n'arrive pas en l'absence de unset ($_SESSION['matrice'][$key]);
Son origine réside sans doute dans son utilisation mais je ne vois pas où se trouve l'erreur.
 
Cordialement,
 
tete278

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed