supprimer element tableau

Eléphant du PHP | 171 Messages

17 nov. 2005, 11:27

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.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

17 nov. 2005, 12:54

Bonjour,
sur www.php.net, si tu cherches array_push, il te propose les liens vers plusieurs fonctions dont array_pop
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 171 Messages

17 nov. 2005, 14:59

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?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

17 nov. 2005, 15:46

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]);
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 171 Messages

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?

ViPHP
ViPHP | 1380 Messages

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.
ripat

Eléphant du PHP | 171 Messages

17 nov. 2005, 17:55

merci bcp!

Eléphant du PHP | 171 Messages

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?

Mammouth du PHP | 1311 Messages

17 nov. 2005, 18:14


ViPHP
ViPHP | 1380 Messages

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);
ripat

Eléphant du PHP | 171 Messages

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?

ViPHP
ViPHP | 1380 Messages

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>';
ripat

Eléphant du PHP | 171 Messages

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.

ViPHP
ViPHP | 1380 Messages

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!
ripat

Eléphant du PHP | 171 Messages

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?