sandrinoo Posté 9 Janvier 2018 Posté 9 Janvier 2018 Bonjour à toutes et tous, Je bloque là dessus, je voudrais afficher toutes les combinaisons possible de 2 chiffres avec a, b et c soit : 1/ ab, ba, ac, ca, bc, cb MAIS PAS aa, bb, cc : comment faire ? 2/ je voudrais aussi que chaque résultat soit associé à l'addition des chiffres associés à chaque lettre soit par exemple pour ab : 33+17=50 je pense qu'il faudrait un tableau multidimensionnel mais je n'arrive pas à faire ce que je veux, ça à l'air de dépasser mon niveau de compétence neuronale... Voici mon code : $tableau = array('17'=>'a','33' =>'b', '89'=> 'c'); foreach ($tableau as $x) foreach ($tableau as $y) $combinaison[] = $x.$y; {echo '<pre>'; print_r ($combinaison); echo '</pre>';} Si une âme charitable de passage veut bien me donner un petit coup de pouce en cette nuit froide du mardi 9 janvier de l'an de grâce 2018... Sand.
adn Posté 10 Janvier 2018 Posté 10 Janvier 2018 Hello, Si j'ai bien compris... et non testé $t = array('17'=>'a','33' =>'b', '89'=> 'c'); $c = []; foreach(range('a','z') as $i) { foreach(range('a','z') as $j) { if ($i != $j) { echo $i, $j, '<br/>'; echo $t[$i]+$t[$j], '<br/>'; $c[$i.$j] = $t[$i]+$t[$j]; } } }
sandrinoo Posté 10 Janvier 2018 Auteur Posté 10 Janvier 2018 Salut ADN et merci beaucoup d'avoir pris le temps de me répondre. C'est pas vraiment ce que je recherche. Ce que tu me donnes génère : ab 0, ad 0, ae 0 etc... (je ne veux pas qu'il y ait d'autres lettres que abc et l'addition n'est pas fait sur les chiffres) moi j'aimerais simplement pour mon exemple $tableau que le script m'affiche un truc du style : ab 50, ba 50, ac 106, ca 106, bc 122, cb 122 (et c'est tout). Peut-être que mon tableau de départ est à modifier (en tableau multidimensionnel ?), bref je sais pas trop comment m'y prendre pour arriver à mon résultat...
Dan Posté 10 Janvier 2018 Posté 10 Janvier 2018 En inversant la définition de ton tableau ... $t = array('a'=>'17','b'=>'33', 'c'=>'89'); $c = []; foreach(range('a','c') as $i) { foreach(range('a','c') as $j) { if ($i != $j) { $c[$i.$j] = $t[$i]+$t[$j]; } } } print_r($c); Donne ceci : Array ( [ab] => 50 [ac] => 106 [ba] => 50 [bc] => 122 [ca] => 106 [cb] => 122 ) En mettant range('a','z') on obtient une liste plus longue, avec par exemple [da]->17 ou [az]=>17 vu qu'il n'y a qu'un seul élément, ici 'a' qui vaut 17. C'est juste, mais le résultat fait brouillon à cause de tous les duplets qui valent 0 comme [er], [tz] etc....
sandrinoo Posté 10 Janvier 2018 Auteur Posté 10 Janvier 2018 Formidable Dan ! Merci beaucoup. C'est vrai que le code d'adn n'était pas loin du but... Tu me coupes l'herbe sous le pied et ton code répond parfaitement à mon post précédent ! 1/ maintenant j'ai juste un doute sur mon $tableau de départ : est-il correct ? 2/ car peut-être plus loin dans le développement de mon script j'aurais besoin en outre que le code m'affiche en plus les traditionnelles données 0 pour [ab] => 50, 1 pour [ac] => 106, 2 pour [ba] => 50 etc... Je ne suis pas sûre d'avoir besoin de cela mais je préfère avoir tout en main pour ne pas être bloquée dans la poursuite de mon code. Ca complique le script d'avoir ça ?
Dan Posté 10 Janvier 2018 Posté 10 Janvier 2018 <?php $t = array('a'=>'17','b'=>'33', 'c'=>'89'); $c = array(); foreach(range('a','c') as $i) { foreach(range('a','c') as $j) { if ($i != $j) { $c[][$i.$j] = $t[$i]+$t[$j]; } } } print_r($c); ?> Donne ceci : Array ( [0] => Array ( [ab] => 50 ) [1] => Array ( [ac] => 106 ) [2] => Array ( [ba] => 50 ) [3] => Array ( [bc] => 122 ) [4] => Array ( [ca] => 106 ) [5] => Array ( [cb] => 122 ) ) C'est ce que tu cherches ? Dans ce cas un "print_r($c[3])" donne ceci : Array ( [bc] => 122 )
sandrinoo Posté 10 Janvier 2018 Auteur Posté 10 Janvier 2018 (modifié) Parfait ! Tu sembles lire dans mes pensées. Mais petit problème encore (la ch...) : en voulant simplifier mon $tableau de départ pour les lecteurs du forum je viens de me rendre compte que ça va pas coller en fait : c'est de ma faute j'ai simplifier en mettant des lettres (a, b, c) alors que mon script a besoin de variables à la place ($var1, $var2, $var3) et du coup cela ne vas pas coller avec le range('a','c') Je vais déjeuner et regarder cela de plus près à mon retour... Bon app Dan ! Modifié 10 Janvier 2018 par sandrinoo
Dan Posté 10 Janvier 2018 Posté 10 Janvier 2018 Que contiennent les variables $var1, $var2, $var3... ?
sandrinoo Posté 10 Janvier 2018 Auteur Posté 10 Janvier 2018 désolée pour le retard Dan, ces variables contiennent des mots.
adn Posté 10 Janvier 2018 Posté 10 Janvier 2018 Tu nous donnes le contenu du tableau de départ pour comprendre
sandrinoo Posté 10 Janvier 2018 Auteur Posté 10 Janvier 2018 $t = array($mot1 =>$nb1, $mot2=>$nb2, $mot3 =>$nb3);
Dan Posté 10 Janvier 2018 Posté 10 Janvier 2018 J'y arrive comme ceci : <?php $a="pommes"; $b="poires"; $c="oranges"; $base = [ [$a, 17], [$b, 33], [$c, 89], ]; foreach($base as list($x1, $y1)) { foreach($base as list($x2, $y2)) { if (strcmp($x1, $x2)) printf("Fruits: %s+%s\tQuantité : %d\n",$x1,$x2,$y1+$y2); } } ?> Ce qui donne, à l'exécution : Fruits: pommes+poires Quantité : 50 Fruits: pommes+oranges Quantité : 106 Fruits: poires+pommes Quantité : 50 Fruits: poires+oranges Quantité : 122 Fruits: oranges+pommes Quantité : 106 Fruits: oranges+poires Quantité : 122 Il est clair qu'additionner des pommes, poires et oranges n'a pas beaucoup de sens... mais c'est juste pour l'exemple. Sans passer par les variables $a, $b et $c, tu pourrais déclarer ton array comme ceci : $base = [ ["pommes", 17], ["poires", 33], ["oranges", 89], ];
Dan Posté 11 Janvier 2018 Posté 11 Janvier 2018 Et si tu veux mettre le résultat dans une array, remplace if (strcmp($x1, $x2)) printf("Fruits: %s+%s\tQuantité : %d\n",$x1,$x2,$y1+$y2); par if (strcmp($x1, $x2)) { printf("Fruits: %s+%s\tQuantité : %d\n",$x1,$x2,$y1+$y2); $resultat[$x1."-".$x2] = $y1+$y2; } un print_r($resultat) donnera ceci : Array ( [pommes-poires] => 50 [pommes-oranges] => 106 [poires-pommes] => 50 [poires-oranges] => 122 [oranges-pommes] => 106 [oranges-poires] => 122 )
Dan Posté 11 Janvier 2018 Posté 11 Janvier 2018 Et si tu veux que cela soit numéroté à partir de 0, $resultat[][$x1."-".$x2] = $y1+$y2; donnera Array ( [0] => Array ( [pommes-poires] => 50 ) [1] => Array ( [pommes-oranges] => 106 ) [2] => Array ( [poires-pommes] => 50 ) [3] => Array ( [poires-oranges] => 122 ) [4] => Array ( [oranges-pommes] => 106 ) [5] => Array ( [oranges-poires] => 122 ) ) Dan PS: ça m'amuse de me replonger dans le php, ça faisait longtemps...
sandrinoo Posté 11 Janvier 2018 Auteur Posté 11 Janvier 2018 Alors là, Merci beaucoup Dan pour toutes ces réponses ! Vraiment... Désolée, j'étais très prise aujourd'hui, et je viens de tester ton code : ça marche nickel ! J'ai toujours eu du mal avec les array php : peut-être que je devrais me faire un cours plus approfondi car j'avoue mélanger un peu tout ça J'ai un apprentissage un peu empirique du php et je m'y intéresse quand j'en ai besoin : j'ai donc de très grandes lacunes. J'aime bien résoudre les problèmes par moi même mais quand ça bloque, ça bloque et je suis vraiment content de savoir que je peux compter sur webmaster-hub, et surtout toi. Bref Merci d'être là ! En tout cas quand ça fonctionne c'est de l'ordre de la magie pour moi ! j'ai encore juste un petit souci au niveau de : $base = [ [$a, $nb1], [$b, $nb2], [$c, $nb3] ]; De temps en temps la paire de variable $a/$nb1 ou $b/$nb2 ou encore $c/$nb3 n'existe pas et je pensais qu'elle n'allait pas apparaître dans l'array $base mais elle apparaît quand même vide. Comment faire pour qu'elle n'apparaisse que si elle existe ? j'ai essayé de mettre un array_filter devant base mais sans succès. Si tu penses à un truc à essayer Dan, ne te gène surtout pas de me le dire...
Dan Posté 12 Janvier 2018 Posté 12 Janvier 2018 Il y a 13 heures, sandrinoo a dit : De temps en temps la paire de variable $a/$nb1 ou $b/$nb2 ou encore $c/$nb3 n'existe pas et je pensais qu'elle n'allait pas apparaître dans l'array $base mais elle apparaît quand même vide. Comment faire pour qu'elle n'apparaisse que si elle existe Je ne suis pas sûr de comprendre .... Tu récoltes ces chaînes de caractères/valeurs de quelle manière ? Il y a 10 heures, adn a dit : Tu vas trop vite Dan, je n'arrive pas à suivre J'avais un peu de temps libre et trouvais ce petit problème amusant, surtout avec les infos distillées au compte-gouttes. C'est un peu du ball-trap, on vise une cible mouvante.
adn Posté 12 Janvier 2018 Posté 12 Janvier 2018 Oui j'aime bien aussi ces petits problèmes de code mais pour être mouvant, il est mouvant
Dan Posté 12 Janvier 2018 Posté 12 Janvier 2018 @sandrinoo : Si tes éléments ne sont pas forcément définis, tu peux créer ton array en testant tes éléments d'abord : $base = array(); if (isset($a)) $base[] = [$a, 17]; if (isset($b)) $base[] = [$b, 33]; if (isset($c)) $base[] = [$c, 89]; Si je modifie la ligne $b="poires" en $d="poires", cela donne ceci : Fruits: pommes+oranges Quantité : 106 Fruits: oranges+pommes Quantité : 106 Array ( [0] => Array ( [pommes-oranges] => 106 ) [1] => Array ( [oranges-pommes] => 106 ) ) Vu que $b n'existe plus, les poires ont disparu du résultat final.
Dan Posté 12 Janvier 2018 Posté 12 Janvier 2018 Ou encore, en plus court pour remplacer la série de if() $base = array(); isset($a) && $base[] = [$a, 17]; isset($b) && $base[] = [$b, 33]; isset($c) && $base[] = [$c, 89];
sandrinoo Posté 12 Janvier 2018 Auteur Posté 12 Janvier 2018 Ca y'est ! Tout fonctionne à merveille désormais ! J'avais bien testé avec isset pour vérifier si la variable existait mais visiblement trop en amont dans le script, car ça fonctionnait pas. En tout cas grand merci à toi Dan, J'ai bien failli me faire engloutir dans ce sable mouvant de code php je suis saine et sauve et super contente Bon déjeuner à tous et encore merci ! Et longue vive à Webmaster-Hub !
sandrinoo Posté 12 Janvier 2018 Auteur Posté 12 Janvier 2018 T'en fais surtout pas Dan, je reviendrais un de ces 4, sois en sûr Avec des demandes de plus en plus tarabiscotées dont j'ai le secret
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant