Page 1 sur 2
supprimer element tableau
Posté : 17 nov. 2005, 11:27
par donatello
Bonjour à tous,
j'aimerais savoir quelle fonction php fait le contraire de array_push(), c'est à dire supprimer un élément défini d'un tableau.
Merci pour vos réponses.
Posté : 17 nov. 2005, 12:54
par zeus
Bonjour,
sur
www.php.net, si tu cherches array_push, il te propose les liens vers plusieurs fonctions dont
array_pop
Posté : 17 nov. 2005, 14:59
par donatello
en fait je n'ai trouvé aucune fonction qui permet de préciser quel élément on veut supprimer.
dans array push, on peut faire:
$tab= array("a", "b", "c", "d");
array_push($tab, "e");
et on aura
$tab= array("a", "b", "c", "d", "e");
Par contre si je fais
array_slice($tab, "c");
l'élément "c" n'est pas supprimé. Idem si j'utilise array_shit array_pop ou array_splice.
Comment faire?
Posté : 17 nov. 2005, 15:46
par zeus
avec
unset() après avoir cherché la clé qui correspond à la valeur que tu veux supprimer
$tab= array("a", "b", "c", "d", "e");
$indice = array_search("e");
unset($tab[$indice]);
Posté : 17 nov. 2005, 16:11
par donatello
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?
Posté : 17 nov. 2005, 16:17
par Ripat
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.
Posté : 17 nov. 2005, 17:55
par donatello
merci bcp!
Posté : 17 nov. 2005, 18:12
par donatello
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?
Posté : 17 nov. 2005, 18:14
par jeff
Posté : 17 nov. 2005, 18:19
par Ripat
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);
Posté : 17 nov. 2005, 18:53
par donatello
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?
Posté : 18 nov. 2005, 16:08
par Ripat
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>';
Posté : 18 nov. 2005, 16:31
par donatello
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.
Posté : 18 nov. 2005, 17:11
par Ripat
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!
Posté : 18 nov. 2005, 22:47
par donatello
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?