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 :

Vérifier une condition créée de manière dynamique [PHP 5.2]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de nicoaix
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2004
    Messages
    571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2004
    Messages : 571
    Par défaut Vérifier une condition créée de manière dynamique
    Bonjour,
    Je souhaite vérifier une condition dont les éléments sont dynamiques. Je m'explique : j'ai une condition de la forme valeur1 opérateur valeur2.
    valeur1, opérateur et valeur2 sont dans des variables php:
    $valeur1 = 12;
    $operateur = '>';
    $valeur2 = 16;

    Je veux savoir si ma condition est vraie ou fausse.
    J'essaie ça:
    $condition = $valeur1.$operateur.$valeur2;
    if($condition){
    $resultat = "vrai";
    }else{
    $resultat = "non";
    }
    echo "resultat = ".$resultat;

    Il m'affiche tout le temps vrai quelque soit les valeurs des variables (valeur1 et valeur2).

    Comment faire pour vérifier cette condition?

    Merci.

  2. #2
    Membre Expert
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 564
    Par défaut
    Je ne sais pas si on peut faire autrement mais une solution serait de faire un switch :

    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
    switch($operateur){
    	case '>':
    		if($valeur1 > $valeur2){
     
    		}
    		break;
     
    	case '<':
    		if($valeur1 < $valeur2){
     
    		}
    		break;
     
    	// etc...
    }

  3. #3
    Membre éclairé Avatar de nicoaix
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2004
    Messages
    571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2004
    Messages : 571
    Par défaut
    Sans doute mais le problème c'est que dans mon application j'ai en fait 5 conditions possibles construites sur le même procédé. Ca risque donc avec cette solution de faire très compliqué.
    J'ai un système du genre:
    $condition = $condition 1." ".$condition2." ".$condition3." ".$condition4." ".$condition5

    Avec:
    $condition1 = $valeur1.$operateur1.$valeur2;
    $condition2 = $op_logique1.$valeur3.$operateur2.$valeur4;
    $condition3 = $op_logique2.$valeur5.$operateur3.$valeur6;
    $condition4 = $op_logique3.$valeur7.$operateur4.$valeur8;
    $condition5 = $op_logique4.$valeur9.$operateur5.$valeur10;

    Ca risque donc de faire un paquet de switch... non?

  4. #4
    Membre éclairé Avatar de nicoaix
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2004
    Messages
    571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2004
    Messages : 571
    Par défaut
    Ca ne fonctionne pas. Voici le code utilisé:
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    	$x = 12;
    	$y = 16;
    	$op = '>=';
     
    			switch($op){
    				case '=':
    					$condition = $x." = ".$y;
    					break;
    				case '>':
    					$condition = $x." > ".$y;
    					break;
    				case '>=':
    					$condition = $x." >= ".$y;
    					break;
    				case '<':
    					$condition = $x." < ".$y;
    					break;
    				case '<=':
    					$condition = $x." <= ".$y;
    					break;
    				case '<>':
    					$condition = $x." <> ".$y;
    					break;
    			}
     
    	if($condition){
    		$rep = "oui";
    	}else{
    		$rep = "non";	
    	}
     
    echo "condition : ".$condition."<br>rep = ".$rep;
    Il renvoit toujours oui.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Par défaut
    Citation Envoyé par nicoaix Voir le message
    Ca ne fonctionne pas. Voici le code utilisé:
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    	$x = 12;
    	$y = 16;
    	$op = '>=';
     
    			switch($op){
    				case '=':
    					$condition = $x." = ".$y;
    					break;
    				case '>':
    					$condition = $x." > ".$y;
    					break;
    				case '>=':
    					$condition = $x." >= ".$y;
    					break;
    				case '<':
    					$condition = $x." < ".$y;
    					break;
    				case '<=':
    					$condition = $x." <= ".$y;
    					break;
    				case '<>':
    					$condition = $x." <> ".$y;
    					break;
    			}
     
    	if($condition){
    		$rep = "oui";
    	}else{
    		$rep = "non";	
    	}
     
    echo "condition : ".$condition."<br>rep = ".$rep;
    Il renvoit toujours oui.
    Se serait plutôt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     $condition = ($x >= $y);
    ect ect

    a plus

  6. #6
    Membre chevronné Avatar de goodpz
    Profil pro
    Inscrit en
    Février 2007
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 475
    Par défaut
    Question intéressante.

    Ca ne va pas fonctionner comme tu tentes de le faire (nicoaix) parceque "if ($condition)" avec $condition une chaîne, ça sera toujours vrai (sauf si la chaîne est nulle).

    A mon avis, tu peux passer par eval() mais ça va être fastidieux. Tu peux aussi passer par create_function() et donc, comme pour eval, gérer le code php à la volée. Je ne pense pas que ce soit évident.

    Une autre solution: un mini "interpréteur" :
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    abstract class Op {
      protected $r;
      protected $l;
      function __construct($l, $r = null) {
        $this->l = $l;
        $this->r = $r;
      }
      abstract function ev(); // eval
    }
    class And_ extends Op { // &&
      function ev() {
        return $this->l->ev() && $this->r->ev();
      }
    }
    class Or_ extends Op { // ||
      function ev() {
        return $this->l->ev() || $this->r->ev();
      }
    }
    class Less extends Op { // <
      function ev() {
        return $this->l->ev() < $this->r->ev();
      }
    }
    class LessEq extends Op { // <=
      function ev() {
        return $this->l->ev() <= $this->r->ev();
      }
    }
    class Leaf extends Op {
      function ev() {
        return $this->l;
      }
    }
     
    //exp = 12 < 16 && (18 < 16 || 16 <= 16)
    $exp = 
    new And_(
       new Less( new Leaf(12), new Leaf(16) )
      ,new Or_(
         new Less( new Leaf(18), new Leaf(16) )
        ,New LessEq( new Leaf(16), new Leaf(16) )
      )
    );
     
    echo $exp->ev(); // 1 (true)
     
     
    $lookup = array(
      '&&' => 'And_',
      '||' => 'Or_', 
      '<'  => 'Less', 
      '<=' => 'LessEq'
    );
     
    $v1 = new Leaf(12);
    $v2 = new Leaf(16);
    $o1 = '<=';
     
    $oc1 = new $lookup[$o1]($v1, $v2);
    echo $oc1->ev(); // 12 <= 16 (true)
     
    $v3 = new Leaf(3);
    $v4 = new Leaf(42);
    $o2 = '<';
    $oc2 = new $lookup[$o2]($v3, $v4);
     
    $o3 = '&&';
    $oc3 = new $lookup[$o3]($oc1, $oc2);
     
    echo $oc3->ev(); // 16 <= 16 && 3 < 42 (true)

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 25/05/2011, 07h16
  2. Appeler une feuille XSL de manière dynamique
    Par uNreal dans le forum XSL/XSLT/XPATH
    Réponses: 0
    Dernier message: 02/05/2011, 13h51
  3. [WD14] Maintenir des champs crées de manière dynamique
    Par devalender dans le forum WinDev
    Réponses: 7
    Dernier message: 25/01/2011, 13h48
  4. Peut-on lier une balise Object de manière dynamique ?
    Par Fngonka dans le forum ASP.NET
    Réponses: 2
    Dernier message: 31/12/2008, 10h50
  5. Réponses: 5
    Dernier message: 07/08/2007, 10h10

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