supprimer element tableau

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 : supprimer element tableau

par donatello » 19 nov. 2005, 19:02

merci bcp!

par Ripat » 19 nov. 2005, 17:29

Oui, c'est le principe. Codé différemment mais le principe est le même. On boucle tant qu'on a pas tiré une valeur absente de ton résultat. Mon code est à peu près 50% plus rapide sans que je ne puisse expliquer pourquoi (sur 1000 itérations).

Fais juste attention à mettre une limite à ton while. Tu risques de rentrer dans une boucle infinie si tu ne testes pas: ($total > 4)

Même si tu as le contrôle sur tes paramètres, c'est une bonne habitude de se protéger des boucles infinies. Rajoute simplement:
($total > 4) or die ('ATENTION Solution impossible sans doublons');

par donatello » 19 nov. 2005, 14:37

oui, ça devait être à cause du cache. Ton script m'a aidé à faire ceci qui semble bien marcher:
$total= 10;
$selection=array();
$hasard=array();

//on va prendre 4 chiffres au hasard
for ($i=0; $i<4; $i++) {
$hasard[$i]= rand(1, $total);
                //tant que le chiffre est déjà dans la sélection, on recommence
	while (in_array($hasard[$i], $selection)) {
		$hasard[$i]= rand(1, $total);		
	}
//on ajoute les sélections dans le tableau	
array_push($selection, $hasard[$i]) ; 	

//on affiche le tableau...
echo $selection[$i]."</br>";

//...ou on met dans une session
$_SESSION[$i] = $selection[$i];

}
qu'en pensez-vous?

par Ripat » 18 nov. 2005, 23:05

Non.

Tu devrais avoir des valeurs différentes à chaque fois. Vide le cache de ton naviguateur.

par donatello » 18 nov. 2005, 22:47

ripat, ta première solution me plait pas mal.
Seule interrogation, je pensais qu'à chaque actulisation de la page, la sélection aléatoire reprendrait depuis le début.
dans mon cas, la sélection est toujours la même quand on actualise la page.
Est-ce normal?

par Ripat » 18 nov. 2005, 17:11

Il y a encore ceci:
// initialisation
$total     = 15;
$nb        = 4;
$selection = array();
$valeursPossibles = range(1, $total);

// gestion erreur
($total > $nb) or die ('ATENTION Solution impossible sans doublons');

// construction du tableau
for ($i = 0; $i < $nb ; $i++){
  $total--;
  $rand = mt_rand(1, $total);
  $tirage = array_splice($valeursPossibles, $rand, 1);
  $selection[] = $tirage[0];
}
Plus élégant, peut-être, mais *beaucoup* plus lent pour des tirages sans remise sur de gros échantillons (variable $total importante).

La bête boucle for suivie d'un test sur in_array fait mieux le travail!

par donatello » 18 nov. 2005, 16:31

super, je crois que c'est ça qui me manquait: in_array(), une fonction que je connaissais pas. je crois que ça va résoudre mon pb...la suite dans quelques minutes.

par Ripat » 18 nov. 2005, 16:08

Une fois encore, plusieurs solutions possibles. En voici une:
// initialisation
$total     = 15;
$nb        = 4;
$selection = array();

// gestion erreur (pour éviter une boucle infinie!)
($total > $nb) or die ('ATENTION Solution impossible sans doublons');

// construction du tableau
for ($i = 0; $i < $nb ; $i++){
  $rand = mt_rand (1, $total);
  if (in_array($rand, $selection)){
    $nb++;
  }else{
    $selection[] = $rand;
  }
}

// affichage
echo 'Nombre d\'itérations effectuées: '.$nb.'<br><pre>';
print_r($selection);
echo '</pre>';

par donatello » 17 nov. 2005, 18:53

bon, je vous expose mon pb parceque je ne sais plus comment m'y prendre.
j'ai une variable $total dont la valeur est 50.
Je sélectionne 4 chiffres au hasard à partir de cette variable
$total= 50
$selection0 = rand(1, $total); 
$selection1 = rand(1, $total);
$selection2 = rand(1, $total);
$selection3 = rand(1, $total);
Avec cette façon de faire, deux sélections peuvent avoir la même valeur.
je voudrais que chaque sélection soit unique, que le même chiffre ne puisse pas ressortir plusieurs fois.
Comment faire?
Comment faire?

par Ripat » 17 nov. 2005, 18:19

C'est, à nouveau, dans la doc.

Unset ne retourne rien (void) et agit directement sur le tableau.
void unset ( mixed var [, mixed var [, mixed ...]] )
En passant, le tableau n'est pas réindexé après un unset. Il y aura des trous dans les indices.

Pour réindexer si nécessaire:
$tableau = array_values($tableau);

par jeff » 17 nov. 2005, 18:14

par donatello » 17 nov. 2005, 18:12

une derniere tite question:
quand je fais:
$indice = array_search($tab, "e"); 
unset($tab[$indice]); 
ça marche, mais par contre ceci
$indice = array_search($tab, "e"); 
$supp=unset($tab[$indice]); 
me retourne un parse error, comme si on ne pouvait pas mettre unset() dans une variable. comment expliquer ça?

par donatello » 17 nov. 2005, 17:55

merci bcp!

par Ripat » 17 nov. 2005, 16:17

Warning: array_search(): Wrong datatype for second argument in c:\

qu'est ce qui m'échappe?
Il faut respecter l'ordre des arguments dans une fonction. Regarde bien le prototype de cette fonction dans la doc et tu trouveras ton erreur.

par donatello » 17 nov. 2005, 16:11

quand je fais:
$indice = array_search("e"); 
unset($tab[$indice]); 
je reçois l'erreur
Warning: Wrong parameter count for array_search() in c:
J'ai essayé
$indice = array_search($tab, "e"); 
unset($tab[$indice]); 
mais autre erreur
Warning: array_search(): Wrong datatype for second argument in c:\
qu'est ce qui m'échappe?