[RESOLU] Besoin d'aide avec fonction array_rand et array_splice

Petit nouveau ! | 7 Messages

13 févr. 2014, 18:28

Bonjour A tous
J'ai cherché une section de présentation membre avant de commencer de but en blanc, mais je n'ai pas trouvé.
S'il en existe une, excusez ma mauvaise recherche et j'irai la remplir :)

Tout débutant en PHP je tâtonne un peu à droite à gauche.

Je cherche à générer une ligne de 9 valeurs (soyons précis, de 9 chiffres), allant de 1 à 9, triés aléatoirement et par groupe de 3 chiffres
Donc résultat1= A,B,C; résultat2=D,E,F ; résultat3=G,H,I
Résultat final = ABCDEFGHI

j'ai donc commencé simple avec un array et une fonction de choix aléatoire.
Dans cet exemple je lui demande donc de choisir 3 valeurs de mon tableau, et de façon aléatoire.
$numbers=array(1,2,3,4,5,6,7,8,9);

$result=array_rand($numbers,3);
print_r($result)  ;
Très bien, sauf que parfois ca va, mais parfois il me sort un "0" parmi les 3 valeurs...?
//résultat
Array ( [0] => 0 [1] => 4 [2] => 5 )
Pourquoi donc ?
mon ARRAY va de 1 à 9, pas de 0 à 9...
Où va-t-il chercher le 0 ?
Modifié en dernier par Mousshaker le 13 févr. 2014, 18:54, modifié 2 fois.
Gentil NoOb deviendra Bo(O)n
[Ou pas...]

Eléphant du PHP | 116 Messages

13 févr. 2014, 18:41

Salut,

Est-ce qu'il t'a déjà retourné 9 ? Non, hein ? :-)

Regarde la doc : "Sélectionne une ou plusieurs valeurs au hasard dans un tableau et retourne la ou les clés de ces valeurs."
Il te retourne pas les valeurs, mais les clefs ! C'est à dire qu'après tu peux faire :
echo $numbers[$result[0]];
echo $numbers[$result[1]];
// etc ...
echo $numbers[$result[8]];
Et hop, ils sont là tes chiffres ;-)

@+
@+,
Computarelier

Petit nouveau ! | 7 Messages

13 févr. 2014, 18:44

Ah oui en effet... 8 au maxi ^^

Donc si je comprends bien, c'est que je n'utilise pas la bonne fonction, ou du moins pas correctement
=> shame :oops:

mais alors, quelle fonction je peux utiliser pour qu'il me sélectionne et me retourne, aléatoirement, 3 valeurs parmi les 9 de mon tableau ? :|
Gentil NoOb deviendra Bo(O)n
[Ou pas...]

ViPHP
xTG
ViPHP | 7331 Messages

13 févr. 2014, 18:56

$numbers=array(1,2,3,4,5,6,7,8,9);
$returnNumber = 3;
$keys = array_rand($numbers, $returnNumber); // on sort trois clés
foreach($keys as $key)
{
   echo $numbers[$key] . '<br />';
}
ou bien :
$numbers=array(1,2,3,4,5,6,7,8,9);
shuffle($numbers); // on mélange
// on extrait trois nombres
echo array_pop($numbers). '<br />';
echo array_pop($numbers). '<br />';
echo array_pop($numbers);

Mammouth du PHP | 2278 Messages

13 févr. 2014, 19:06

Sélectionne une ou plusieurs valeurs au hasard dans un tableau et retourne la ou les clés de ces valeurs.
IQuand il tire 1, il renvoie la clef 0 sauf si tu écris ainsi
$nombres = array (1 =>1, 2=>2....);
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Petit nouveau ! | 7 Messages

13 févr. 2014, 19:21

Si je commence à confondre CLEF et VALEUR, effectivement, je suis mal barré :/

Merci de votre aide :)

Mais du coup, j'ai toujours mon second problème auquel je viens maintenant : la fonction array_splice

J'ai donc sélectionné par mis mon ARRAy $tableau 3 valeurs, qui se trouvent dans $résult.
Je souhaiterais maintenant extraire de $tableau, les 3 valeurs de $result

EXEMPLE :
$numbers=array(1,2,3,4,5,6,7,8,9);
// j'ai fais mon array_rand et j'ai en résultat suite à print_r($result):

Array ( [0] => 1 [1] => 3 [2] => 9 ) 
Je voudrais donc maintenant exclure 1, 3 et 9 de $tableau
J'ai donc fais :
for ($k=0;$k<3;$k++)
    {
        
  array_splice($numbers,$result[$k],1);
        
     }
Et là, il me sort , lorsque je lui demande de me retourner les valeurs de $numbers
print_r(array_values($numbers));

//résultat obtenu :
Array ( [0] => 1 [1] => 3 [2] => 4 [3] => 6 [4] => 7 [5] => 8 [6] => 9 ) 
Il ne m'a donc déjà pas retiré 3 valeurs (comme j'ai demandé dans ma boucle), mais seulement 2
Et en plus, les valeurs de $result se trouvent toujours dans $tableau

je sais que j'ai mal utilisé la fonction, mais je n'arrive pas à comprendre où
Gentil NoOb deviendra Bo(O)n
[Ou pas...]

ViPHP
xTG
ViPHP | 7331 Messages

13 févr. 2014, 21:17

array_splice — Remove a portion of the array and replace it with something else
Tout est dit...
Pour supprimer un élément regardes plutôt du côté de unset().

Petit nouveau ! | 7 Messages

13 févr. 2014, 22:08

Alors au temps pour moi
J'avais cru comprendre que si y'avait de rien de spécifié en remplacement, il se contentait de supprimer ^^

Merciii
Gentil NoOb deviendra Bo(O)n
[Ou pas...]

ViPHP
xTG
ViPHP | 7331 Messages

13 févr. 2014, 22:52

Bon en fait on va avoir le droit tous les deux d'aller dormir...
Tu as raison sur le dernier paramètre (j'avais mal compté tes paramètres).
Par contre tu n'utilises pas correctement la fonction.
array_splice($numbers,$result[$k],1);
Va supprimer à partir de l'index $result[$k] 1 valeur de l'array $numbers.
Cela n'a aucunement pour but de supprimer la valeur $result[$k].
Pour cela le plus simple est la fonction unset() comme dit précédemment.
Ou bien en utilisant array_splice avec une clé et non une valeur (mais ça reste utiliser un bulldozer pour couper une fleur...). :mrgreen:

Petit nouveau ! | 7 Messages

14 févr. 2014, 10:29

Bah avec un buldozer on est sur que la fleur ne nous échappe pas au moins :mrgreen: ^^
Effectivement, je crois aussi que mon soucis venait encore et toujours de là : travailler avec les CLEF en les prenant pour les VALEURS...
Fatalement, ca ne risque pas de me faire le résultat attendu :non:

En te remerciant bien
Gentil NoOb deviendra Bo(O)n
[Ou pas...]