IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

fonction array_rand et array_splice


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Web en formation
    Inscrit en
    Février 2014
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web en formation

    Informations forums :
    Inscription : Février 2014
    Messages : 66
    Par défaut fonction array_rand et array_splice
    Bonjour A tous

    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.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $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...?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //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 ?

  2. #2
    Membre expérimenté
    Avatar de crozet.magenta
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2012
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 208
    Par défaut
    c'est normal de retrouver des 0 dans le résultat, la fonction array_rand retourne une clé aléatoire du tableau. pour récupérer la valeur il faudrait faire ceci :
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $numbers=array(1,2,3,4,5,6,7,8,9);
    $keys=array_rand($numbers,3);
    $result = array();
    foreach ($keys as $key) {
      $result[] = $numbers[$key];
    }
     
    print_r($result);

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Web en formation
    Inscrit en
    Février 2014
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web en formation

    Informations forums :
    Inscription : Février 2014
    Messages : 66
    Par défaut
    Abah forcément, comme ça ça fonctionne tout de suite mieux...
    Fatalement, je retournais des clés que je cherchais ensuite à traiter comme des valeurs...

    Mode BOULET *ON* ^^

    Merci beaucoup

    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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $numbers=array(1,2,3,4,5,6,7,8,9);
    // j'ai fais mon array_rand et j'ai en résultat :
    Array ( [0] => 1 [1] => 3 [2] => 9 )
    Je voudrais donc maintenant exclure 1, 3 et 9 de $tableau
    J'ai donc fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    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ù

  4. #4
    Membre expérimenté
    Avatar de crozet.magenta
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2012
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 208
    Par défaut
    je ne suis pas sur de bien avoir compris ce que tu veux faire... tu veux supprimer de ton premier tableau les valeurs qui ont été tirées ?
    si c'est bien ça, le array splice ne peut pas fonctionner car il n'utilise pas les clés pour se déplacer mais un décalage.
    en clair, prenons l'exemple avec les valeurs que tu as données :
    tu lui demande de se décaler de 1 et d'effacer la case. le tableau fait donc plus que 8 cases de long
    tu lui demande de se décaler de 4 et d'effacer la case. le tableau fait donc plus que 7 cases de long
    tu lui demande de se décaler de 9 et d'effacer la case. Cette case n'existe pas donc il ne fait rien

    essaye avec cette méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $numbers=array(1,2,3,4,5,6,7,8,9);$keys=array_rand($numbers,3);
    $result = array();
    foreach ($keys as $key) {
      unset($numbers[$key]);
    }
     
    print_r($result);
    on n'a même pas besoin de connaitre les valeurs

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur Web en formation
    Inscrit en
    Février 2014
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web en formation

    Informations forums :
    Inscription : Février 2014
    Messages : 66
    Par défaut
    Oui tu as bien compris et je pense avoir aussi saisi ton explication
    effectivement s'il me fait ça, c'est pas du tout ce que je cherche, et comme je m'y prend comme un manche, le code applique ma demande loufoque :p

    En fait mon but final est de constituer une ligne de 3 fois 3 chiffres, choisis aléatoirement parmi un tableau source $numbers (composé des chiffres de 1 à 9)
    Sauf que pour être sur de ne pas avoir de doublon, une fois la première sélection de 3 chiffres effectuée, je veux qu'il me retire du array source (donc de $numbers) les 3 chiffres déjà sélectionnés dans le premier résultat sortis (donc $result)
    Et ce, afin d'être sur qu'au second tour de sélection (que je ferai bien entendu via une boucle) il n'ait plus qu'à sélectionner parmi les 6 chiffres restant.
    Enfin, au troisième tour, il ne restera plus que 3 chiffres à me sortir dans l'ordre aléatoire.

    Du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    //1er tour de boucle
    $numbers=array(1,2,3,4,5,6,7,8,9)// tableau de départ $numbers
    $resultat1=3 5 6 // 3 chiffres choisis aléatoirement parmi $numbers
     
    //2nd tour de boucle
    $numbers=array(1,2,4,7,8,9) // $numbers - $resultat1
    $resultat2= 8 1 4
     
    //3eme tour de boucle
    $numbers=array(2,7,9) // $numbers - $resultat2
    $resultat3= 9 2 7
     
     
    //fin et sortie de boucle
    $resultatFinal = 3 5 6 8 1 4 9 2 7

  6. #6
    Membre expérimenté
    Avatar de crozet.magenta
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2012
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 208
    Par défaut
    ok dans ce cas, le code suivant devrait fonctionner :

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $numbers=array(1,2,3,4,5,6,7,8,9);for ($i=0; $i < 3; $i++) { 
      shuffle($numbers);
      $result1[] = array_pop($numbers);
    }
    for ($i=0; $i < 3; $i++) { 
      shuffle($numbers);
      $result2[] = array_pop($numbers);
    }
    for ($i=0; $i < 3; $i++) { 
      shuffle($numbers);
      $result3[] = array_pop($numbers);
    }
    print_r($result1);
    print_r($result2);
    print_r($result3);

    si le tableau numbers ne doit pas être modifié, il suffit de le copier dans une autre variable et c'est réglé.

    explications du code :
    $numbers = [1,2,3,4,5,6,7,8,9]; déclare un array (c'est la forme raccourcie introduite en php 5.4)
    shuffle mélange le tableau de nombres et array_pop récupère la valeur de la dernière case du tableau et la retire du tableau en même temps
    $result[] permet de mettre un élément dans un tableau en ajoutant une case.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/02/2013, 02h08
  2. Fonction API
    Par margilb dans le forum C++Builder
    Réponses: 2
    Dernier message: 08/07/2002, 12h11
  3. Implémentation des fonctions mathématiques
    Par mat.M dans le forum Mathématiques
    Réponses: 9
    Dernier message: 17/06/2002, 17h19
  4. fonction printf
    Par ydeleage dans le forum C
    Réponses: 7
    Dernier message: 30/05/2002, 12h24
  5. FOnction api specifiant la position de la souris
    Par florent dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/05/2002, 21h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo