Aller au contenu

Combinaisons php associées à un chiffre


sandrinoo

Sujets conseillés

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.

Lien vers le commentaire
Partager sur d’autres sites

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];
	  }
  }
}

 

Lien vers le commentaire
Partager sur d’autres sites

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

 

 

Lien vers le commentaire
Partager sur d’autres sites

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

 

Lien vers le commentaire
Partager sur d’autres sites

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 ?

 

 

Lien vers le commentaire
Partager sur d’autres sites

<?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
)

 

Lien vers le commentaire
Partager sur d’autres sites

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') :unsure:

 

Je vais déjeuner et regarder cela de plus près à mon retour...

 

Bon app Dan !

Modifié par sandrinoo
Lien vers le commentaire
Partager sur d’autres sites

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],
];

 

Lien vers le commentaire
Partager sur d’autres sites

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
)

 

Lien vers le commentaire
Partager sur d’autres sites

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

 

Lien vers le commentaire
Partager sur d’autres sites

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 :blink:

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

 

 

 

Lien vers le commentaire
Partager sur d’autres sites

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 :D

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

 

 

 

 

Lien vers le commentaire
Partager sur d’autres sites

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


 

 

Lien vers le commentaire
Partager sur d’autres sites

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];

 

Lien vers le commentaire
Partager sur d’autres sites

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 :ph34r:

je suis saine et sauve et super contente :whistling:

 

Bon déjeuner à tous et encore merci !

Et longue vive à Webmaster-Hub !

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...