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 :

Répartition de valeurs avec limites


Sujet :

Langage PHP

  1. #21
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 122
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par rawsrc Voir le message
    En gros, ta solution de facilité : un problème => une question alors que cela devrait être : un problème => je recherche et essaie de me débrouiller => j'apprends => je passe au problème suivant. Dans ce schéma, si effectivement la solution ou la rustine trouvée ne colle pas alors je vais poser ma question sur le forum DVP.
    Tu as tout à fait raison, et je ne pose mes questions qu'après avoir planché sur le problème ! Même si je reconnais mes lacunes énormes

    En fait, dans ce cas précis, je me suis mal exprimé quant au mot "doublon" :

    Donc quand tu vas faire un SELECT DISTINCT, le filtre d'unicité s'appliquera logiquement à la totalité du contenu de la cellule, c'est-à-dire mot1,mot2,mot3...
    Si tu as dans une cellule mot1,mot2,mot3... et dans la suivante mot1,mot2,mot4... alors c'est bien deux valeurs distinctes pour le moteur quand bien même pour toi les mots1 et mots2 sont des doublons. Le moteur n'a aucune conscience de tes mots.
    En effet, j'ai justement raisonné comme ça. Je pensais que DISTINCT allait lui faire choisir des cellules différentes, de sorte qu'il n'y ait jamais 2 mots venant de la même cellule. C'est juste ça que je veux éviter. (Le mot doublon était impropre, je voulais dire : "2 mots provenant de la même cellule", car TOUS les mots de la table sont différents.)

    Or il continue de sélectionner de temps à autre 2 mots différents, certes, mais provenant de la même cellule, et c'est là où je ne comprenais pas pourquoi, mais quelque chose doit m'échapper encore

  2. #22
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    suffit juste de modifier légèrement le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while ($words = $qry->fecth_array()) {
        $parts = explode(',', $words[0]);
        $id    = array_rand($parts, 1); // on tire au hasard un mot
        $dic[] = $parts[$id];
    }

  3. #23
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 122
    Points : 38
    Points
    38
    Par défaut
    OK, merci !
    (donc si je comprends bien, cela remplace à la fois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    array_push($dic, ...explode(',', $words[0]));
    et le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    shuffle($dic);
    $dic=array_slice($dic,0,$nbr_mots);
    tout se faisant dans le while().

    Ultime question et je cesse de t'embêter !

    Mes valeurs $carreau, $pique, $coeur et $trefle sont en fait générées aléatoirement par un petit code qui permet de vérifier que la somme de leur valeur est égale à $pm. J'ai fait le code suivant, qui est sans doute maladroit, mais qui fonctionne.
    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
    $couleur=array('carreau','pique','coeur','trefle');
                    $somme=$carreau+$pique+$coeur+$trefle;
                    if ($somme>$pm) {
                        while ($somme>$pm) {
                        $select_couleur=$couleur[array_rand($couleur,1)];
                        if ($$select_couleur-1>$min) { $$select_couleur--; }
                        $somme=$carreau+$pique+$coeur+$trefle;
                        }
                    }
                    if ($somme<$pm) {
                        while ($somme<$pm) { 
                        $select_couleur=$couleur[array_rand($couleur,1)];
                        if ($$select_couleur+1<$max) { $$select_couleur++; } 
                        $somme=$carreau+$pique+$coeur+$trefle;
                        }
                    }
    Mon problème est que je voudrais pouvoir faire en sorte que la plus petite des 4 valeurs soit au moins inférieure de 1 à la suivante, et de même que la plus forte soit au moins supérieure de 1 à la précédente.
    J'ai raisonné avec la logique suivante :trier le tableau par ordre croissant puis comparer les extrémités et les modifier si besoin, mais je n'arrive pas à l'intégrer au code ci-dessus.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    asort($couleur);
    if ($couleur[1]-$couleur[0]<2) { $couleur[0]--; }
    if ($couleur[3]-$couleur[2]<2) { $couleur[3]++; }

  4. #24
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    ton approche est loin d'être optimale, tu lances les dés et croise les doigts pour que cela fonctionne.
    Fait une petite modélisation mathématique de ton problème de tirage et tu y verras tout de suite plus clair (même empiriquement, c'est tout à fait faisable).
    En gros, il faut que tu sois capable de dire à chaque tour quelle est la limite maximale que je ne peux dépasser pour satisfaire toutes mes contraintes.

  5. #25
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    @rawsrc
    J'admire de quelle façon tu as su synthétiser avec brio sa problématique.

    Mais je crains que ton niveau de code soit bien supérieur à ce qu'il est en mesure d'appréhender, compte tenu de son niveau.
    Là, à part lui écrire tout son code...

    Si on prend cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    array_push($dic, ...explode(',', $words[0]));
    Super... mais ça fais quoi... ? (perso, je ne comprends pas non plus... et je serais incapable de le réutiliser)
    A part faire un copier-coller...

    Il serait plus pédagogique de lui montrer, en parallèle, une version "niveau débutant", tu ne crois pas ?

    @cyberlp
    Je t'invite à rechercher dans la DOC toutes les fonctions utilisées par rawsrc dans son code, notamment les Fonctions sur les tableaux :
    • array_push()
    • array_keys()
    • ...
    Dernière modification par Invité ; 05/04/2020 à 14h39.

  6. #26
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,
    Citation Envoyé par jreaux62 Voir le message
    Si on prend cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    array_push($dic, ...explode(',', $words[0]));
    Super... mais ça fais quoi... ? (perso, je ne comprends pas non plus... et je serais incapable de le réutiliser)
    A part faire un copier-coller...
    l'opérateur ... sert à déplier un tableau.
    On va voir de suite en quoi ça consiste : prenons un tableau basique $data = ['a', 'b', 'c'] avec une fonction qui attend 3 paramètres pour fonctionner : function foo($p1, $p2, $p3), on a plusieurs manières pour l'appeler :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $data = ['a', 'b', 'c'];
     
    function foo($p1, $p2, $p3) { }
     
    // la manière basique
    $x = foo($data[0], $data[1], $data[2]);
     
    // ou l'appel à une fonction historique depuis PHP 4.0.4 !!
    $x = call_user_func_array('foo', $data);
     
    // ou l'appel avec PHP 7 en dépliant simplement le tableau en composants : 
    $x = foo(...$data);
    Maintenant avec array_push() : voici le prototype de la fonction array_push ( array &$array [, mixed $... ] ) : int, donc cette fonction attend un tableau en premier paramètre (notez la présence du & qui indique que c'est un passage de variable par référence) suivi d'une liste de paramètres variables qui seront tous ajoutés au tableau passé en premier paramètre :
    Le passage par référence veut tout simplement dire que c'est le tableau d'origine qui sera directement modifié et non une copie.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    array_push($dic, ...explode(',', $words[0]));
     
    // on veut ajouter en une seule fois toutes les valeurs du résultat de la fonction explode()
    // comme explode() renvoie un tableau, on est obligé de le déplier pour ajouter les valeurs 
    // une par une au tableau $dic et rester conforme au prototype de la fonction array_push()
     
     
    // il était possible de procéder de différentes manières
    $dic = array_merge($dic, explode(',', $words[0]));  // ici on est obligé de réaffecter le résultat a $dic car array_merge() renvoie un nouveau tableau copie du premier et étendu
     
    // ou
    foreach (explode(',', $words[0]) as $w) {
        $dic[] = $w;
    }
    Bref comme toujours avec le PHP, il y a généralement une tonne de manières pour arriver à ce que l'on veut

  7. #27
    Invité
    Invité(e)
    Par défaut


    l'opérateur ... sert à déplier un tableau.
    Oui, je l'avais déjà vu dans un autre post, et lu la DOC (je ne sais plus où, car les "mots clés" * ne sont pas évidents à trouver !).
    Mais il faut avouer que ce n'est pas "intuitif" !


    * LOL, si je cherche "php ... array points de suspension"
    je tombe... sur ma Fonctions de troncature de texte - Jérome Réaux ! (qui n'a RIEN à voir ici...)

  8. #28
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    tiens cette fonctionnalité est apparue avec PHP 5.6 : tout est expliqué par ici
    D'autres termes utilisés :
    Opérateur de décomposition
    Décompression des arguments
    Dépliage
    Déballage

    le terme anglais est unpacking

    Avec PHP 7.4, il est maintenant possible de déplier les tableaux les uns dans les autres :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php
    $parts = ['apple', 'pear'];
    $fruits = ['banana', 'orange', ...$parts, 'watermelon'];
    // ['banana', 'orange', 'apple', 'pear', 'watermelon'];

  9. #29
    Invité
    Invité(e)
    Par défaut
    Donc, les mots-clé à chercher sont :
    • "PHP - unpacking Operator (...)"
    • "PHP - Splat Operator (...)"
    • ou "opérateur de décomposition"



    C'est quand même très "pointu",... et ton explication est plus claire que la doc !
    (cela dit, pas sûr que je sois capable de le réutiliser... sans relire la doc)
    Dernière modification par Invité ; 06/04/2020 à 16h55.

  10. #30
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 122
    Points : 38
    Points
    38
    Par défaut
    Merci à vous 2, je me suis replongé dans les tableaux du coup

    En attendant que je maîtrise l'étendue du problème, je butte sur la question suivante.
    Plus tôt, on a affiché la liste des mots par couleur.
    Je voudrais pouvoir attribuer un <div> à chaque mot (qui vont me permettre d'afficher le mot d'une certaine façon en fonction de la couleur à laquelle il appartient).

    Mais du coup si j'ajoute le div ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      $resultat[] = '<img class="icones" style="vertical-align:middle;" src="images/'.$c.'.png"> <div>'.implode(' ', $m).'</div>';
    il va me l'appliquer sur toute la ligne correspondant à la couleur et pas seulement sur un mot.

    Comment faire ?

  11. #31
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 405
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 405
    Points : 4 841
    Points
    4 841
    Par défaut
    Bonjour,

    Essaies ceci :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    implode(" ",array_map(function($a){return "<div>".$a."</div>";},$m));

    Avec l'utilisation d'un tableau des couleurs et des mots :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $couleurs=["red","blue","green"];
    $m=["mot1","mot2","mot3"];
    $compt=-1;
    echo implode("",array_map(function($a) use(&$couleurs,&$compt){
      $compt++;
      return "<div style='color:".$couleurs[$compt]."'>".$a."</div>";}
    ,$m));

    Comme il est possible aussi de remplacer le style par class.

Discussions similaires

  1. [XL-2007] Selection avec répartition des valeurs sur les colonnes
    Par lili31 dans le forum Macros et VBA Excel
    Réponses: 20
    Dernier message: 20/04/2012, 10h16
  2. Requete avec limite pour chaque valeur du IN
    Par grunge0 dans le forum Requêtes
    Réponses: 4
    Dernier message: 29/09/2009, 14h00
  3. [DB2]requete avec 'LIMIT' ?!
    Par beastman007 dans le forum DB2
    Réponses: 13
    Dernier message: 29/01/2007, 10h50
  4. Pb index multi-valeurs avec DBase
    Par Rickless dans le forum Bases de données
    Réponses: 3
    Dernier message: 23/01/2006, 16h50
  5. Retourner une valeur avec une fonction
    Par stephtbest dans le forum ASP
    Réponses: 4
    Dernier message: 31/10/2003, 16h37

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