Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2035 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Suppression de valeurs dans un tableau multidimensionnel

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Suppression de valeurs dans un tableau multidimensionnel

n°1836741
tete278
Posté le 12-01-2009 à 08:45:19  profilanswer
 

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

mood
Publicité
Posté le 12-01-2009 à 08:45:19  profilanswer
 

n°1836760
flo850
moi je
Posté le 12-01-2009 à 10:15:18  profilanswer
 

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


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

n°1836839
tete278
Posté le 12-01-2009 à 12:57:03  profilanswer
 

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.

n°1836863
tete278
Posté le 12-01-2009 à 13:26:08  profilanswer
 

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.

n°1837012
Profil sup​primé
Posté le 12-01-2009 à 17:58:37  answer
 

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.

n°1837115
flo850
moi je
Posté le 12-01-2009 à 22:38:07  profilanswer
 

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

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

n°1837526
tete278
Posté le 13-01-2009 à 18:06:35  profilanswer
 

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

n°1837533
Profil sup​primé
Posté le 13-01-2009 à 18:15:36  answer
 

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

n°1838057
tete278
Posté le 15-01-2009 à 08:11:54  profilanswer
 

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

n°1838849
tete278
Posté le 16-01-2009 à 12:20:40  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Suppression de valeurs dans un tableau multidimensionnel

 

Sujets relatifs
Tri d'un tableauChanger plusieurs images simultanément dans un tableau
Passer d'un tableau html à un tableau css?aide tableau de chaines et allocation dynamique !?
Trie tableau dans un autre tableauPasser un tableau 2D vers un thread
Tri d'un tableauC#: Comment faire un tableau de structs ?
Tableau en C [niveau faible ^^]Création de ligne/ Tableau Type sous excel
Plus de sujets relatifs à : Suppression de valeurs dans un tableau multidimensionnel


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR