Page 1 sur 1

Accumuler signes !=

Posté : 07 nov. 2007, 03:44
par neo765
Salut,

Soit 3 nombres (pour faire simple) compris entre 2 et 14 (2<=$<=14)
$a=5;
$b=7;
$c=14;
J'aimerai pouvoir faire un if disant si les 3 variables sont toutes différentes :
if ($a!=$b!=$c)
{

}
Mais il falait s'en douter cela ne fonctionne pas

Donc j'ai trouvé ce moyen :
if ($a!=$b AND $a!=$c AND $b!=$c)
{

}
La deuxième solution fonctionne mais le problème c'est qu'au lieu d'avoir 3 variables j'en ai 7.

Donc existe il un moyen plus court de faire la meme chose ?

J'ai pensé classer les variables par ordre croissante mais je ne sais pas comment faire, mais j'ai pas encore cherché (si vous pensez que c'est la meilleure solution dites le moi) :wink:

Merci

Posté : 07 nov. 2007, 04:40
par sadeq
Tu mets tes variables dans un tableau et tu utilises la fonction array_unique() pour éliminer les doublons, et si c'est fait ça veut dire que les variables ne sont pas différentes.
<?php
$variables = array ("a" => 2,  "b" =>5, "c"=>2, "d"=>5); //exemple
$uniques = array_unique ($variables);
if (count($variables ) != count($uniques)) { //si le nombre de cases du tableau de base a changé : doublons éliminés
                 echo "variables non différentes! Les doublons trouvés sont : ";
                 print_r( array_diff_uassoc($variables, $uniques, 'key_compare_func')); //trouver les doublons éliminés précédemment
}
else {   echo "variables différentes"; }

//fonction appelée par array_diff_uassoc pour comparer aussi les clés du tableau
function key_compare_func($key1, $key2) {
    if ($key1 === $key2) return 0;
    return ($key1 > $key2)? 1:-1;
}
?>

Re: Accumuler signes !=

Posté : 07 nov. 2007, 10:32
par zeus
La deuxième solution fonctionne mais le problème c'est qu'au lieu d'avoir 3 variables j'en ai 7.
Je ne comprend pas cette phrase :-k
Même si tu écrit 2 fois chaque variable, tu as en que 3 :?

Je pense que tu crois optimiser ton script en ne faisant pas ces 3 tests alors que ça me semble être la solution la plus rapide ;)

Re: Accumuler signes !=

Posté : 07 nov. 2007, 11:12
par neo765
La deuxième solution fonctionne mais le problème c'est qu'au lieu d'avoir 3 variables j'en ai 7.
Je ne comprend pas cette phrase :-k
Même si tu écrit 2 fois chaque variable, tu as en que 3 :?

Je pense que tu crois optimiser ton script en ne faisant pas ces 3 tests alors que ça me semble être la solution la plus rapide ;)
Ce que je veux dire c'est que j'ai simplifié mon exemple en prenant que 3 variables, mais dans mon script j'ai 7 variables :

$a
$b
$c
$d
$e
$f
$g

Et j'ai pas trop envi de faire des if à ralonge.

--------

Merci sadeq je vais étudier ce que tu m'as donné.

Posté : 07 nov. 2007, 11:38
par Berzemus
le script de sadeq marche avec un nombre virtuellement illimité de variables.. ça devrait pouvoir le faire non ?

Posté : 07 nov. 2007, 11:59
par Ryle
La solution de sadeq répond effectivement à ton problème, maintenant tu n'en as pas exprimé le contexte. S'il s'agit d'un tirage aléatoire, il y a des solutions plus simples pour tirer 7 nombres au hasard et sans doublon et éviter ainsi d'avoir à les tester ensuite... (cf. les scripts de loto par exemple)

Posté : 07 nov. 2007, 14:49
par neo765
Il s'agit en faite d'un script pour donner les mains au poke r :

Si 2 variables sont identiques on a un paire
Si aucune variable n'est identique, le joueur à alors une carte forte
Si 3 variables sont identiques on a un brelan

etc...

Et il possible de classer les variables par ordre croissante avec un array, ça serai plus simple non ?

Posté : 07 nov. 2007, 15:00
par Ryle
hmm.. un fan de texas hold'em hein ;)

Tu peux classer les valeurs d'un tableau avec la fonction sort(). Ce sera effectivement beaucoup plus simple pour y détecter une quinte :)

Mais par contre il va te manquer la notion de couleur...

Posté : 07 nov. 2007, 16:24
par neo765
hmm.. un fan de texas hold'em hein ;)

Tu peux classer les valeurs d'un tableau avec la fonction sort(). Ce sera effectivement beaucoup plus simple pour y détecter une quinte :)

Mais par contre il va te manquer la notion de couleur...
Les cartes sont issus d'un base de données :
- Le nom (de 2 pour le 2 à 14 pour l'as)
- La couleur (1 pour coeur, 2 pour pique etc...)

SELECT nom, couleur FROM cartes ORDER BY RAND() LIMIT $nb_carte

Ainsi j'ai la valeur de la carte avec sa couleur.

Je m'informe sur la fonction sort() et je vous tiens au courant.

Meric bien

Posté : 07 nov. 2007, 19:03
par neo765
Alors j'ai testé le sort() :
$matrice = array("$carte_1","$carte_2","$carte_3","$carte_4","$carte_5","$carte_6","$carte_7");
sort ($matrice);
foreach ($matrice as $key => $val) {
echo "$val<br>";
}
Sauf que j'arrive pas à faire un if dans la boucle, serait il possible d'avoir en sortie :

$var1 pour la carte la plus faible
$var2 pour la 2ème carte etc...

Merci

Posté : 08 nov. 2007, 11:09
par Ryle
Regarde du côté de la fonction list(). Maintenant, sachant qu'une fois ton tableau trié par ordre croissant, $tonTableau[0] contient la valeur la plus faible, $tonTableau[1] la suivante, ... jusqu'à $tonTableau[6] la plus forte, c'est peut être pas utile ? :)

Par ailleurs, il est inutile d'encapsuler des variables dans des chaines pour utiliser ces variables (sortez vos variables !!! Image). Ajouter des guillemets empêche php d'utiliser directement la valeur. Il est obligé de parser la chaine, constater qu'elle contient une variable, aller chercher la valeur associée et reconstituer la chaine avec la valeur trouvée au lieu de la retourner direcetment...
$matrice = array ($carte_1,$carte_2,$carte_3,$carte_4,$carte_5,$carte_6,$carte_7); 
Ton code sera plus lisible et php travaillera (un peu) plus rapidement :)

Posté : 12 nov. 2007, 19:34
par neo765
$matrice = array("$carte_1","$carte_2","$carte_3","$carte_4","$carte_5","$carte_6","$carte_7");
sort ($matrice);
foreach ($matrice as $key => $val) {
'$carte'$key=$val;
}
Quand je vais ça, ça ne fonctionne pas.

:cry:

Posté : 12 nov. 2007, 20:42
par zeus
Modération :
neo765, afin d'améliorer la lisibilité de ton message,
pense à utiliser les balises [code] ou [php] (selon le langage utilisé).

Elles sont disponibles au-dessus de la zone de saisie de ton message
lorsque tu postes un nouveau message.

Des indications sont disponibles sur la manière de mettre en forme vos messages dans la FAQ

Posté : 14 nov. 2007, 00:52
par neo765
personne ?

Posté : 14 nov. 2007, 10:31
par Ryle
Modération :
neo765, les "up" sont interdits sur PHPFrance.

Merci de prendre le temps de lire les règlements.



Quant à ton code '$carte'$key, la syntaxe "chaine contre variable" n'existe pas. Si tu veux créer un nom de variable dynamiquement il faut spécifier entre accolade la chaine à utiliser pour constituer le nom de la variable :
${'carte_' . $key} = $val;
Cette façon de procéder est spécifiée dans la documentation php, dans les forums de phpfrance, et très probablement - mais je ne l'ai pas vérifié - dans la FAQ. Une petite recherche t'aurais évitée de perdre une journée et d'être mal vu en faisant un UP ;)