begin process at 2008 07 20 22:40:09
1 213 476 membres
381 nouveaux aujourd'hui
14 167 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

IF - ELSEIF - ELSE AVEC L'OPÉRATEUR TERNAIRE


Information sur la source

Catégorie :Tutoriaux Classé sous : opérateur, ternaire, if, else, elseif Niveau : Débutant Date de création : 25/10/2005 Date de mise à jour : 25/10/2005 14:56:38 Vu : 12 961

Note :
5,5 / 10 - par 2 personnes
5,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (25)
Ajouter un commentaire et/ou une note

Description

Alors voila, moi qui aime bien l'opérateur ternaire pour sa simplicité, je me suis demandé comment on pouvait utiliser cet opérateur avec l'option elseif. Et bien voila :

Source

  • <?php
  • // Imaginons que votre code est de ce type :
  • $var = 1;
  • $var2 = 0;
  • if ( $var === 0 ) {
  • $truc = true;
  • } elseif ( $var2 === 0 ) {
  • $truc = true;
  • } else {
  • $truc = false;
  • }
  • // 6 lignes à écrire pour si peu ? Voici la version compactée :
  • $var = 1;
  • $var2 = 0;
  • $truc = ( $var === 0 ) ? true : ( $var2 === 0 ) ? true : false;
  • // Et oui, en une ligne, j'utilise 2 fois l'opérateur ternaire pour faire comme un if-elseif-else.
  • ?>
  • <?php
  • // ***************** Nouvel exemple un peu plus concret ! *******************
  • // Imaginons que vous souhaitez utiliser votre propre mode de session.
  • // Pour rappel, l'utilisation d'une session oblige à avoir un id de session pour pouvoir s'y retrouver.
  • // Cet id, soit on le fait passer par un cookie, soit par l'URL (jusqu'ici, rien de très compliqué )
  • // Ici, l'id sera stocké soit stocké dans un cookie ( $_COOKIE['session_id'] ), ou par passage dans l'url :
  • // xxx.php?sid=xopiasj53sdf2483sd453s5
  • $sid = ( isset($_COOKIE['session_id']) ) ? $_COOKIE['session_id'] : ( isset($_GET['sid']) ) ? $_GET['sid'] : NULL;
  • ?>
  • Après, il faut faire d'autres test pour valider l'id de session, mais ca je m'en fou, ce que je veux présenter, c'est l'emploi du double opérateur ternaire à la place d'un if/elseif/else.
  • Voila, l'exemple est un peu plus présentable je trouve.
  • Je redonne quand même le même exemple du dessus avec le vieux if/elseif/else :
  • <?php
  • if ( isset($_COOKIE['session_id']) ) {
  • $sid = $_COOKIE['session_id'];
  • } elseid ( isset($_GET['sid'] ) {
  • $sid = $_COOKIE['session_id'];
  • } else {
  • $sid = NULL;
  • }
  • ?>
  • Enfin, moi perso, je trouve rebarbatif d'utiliser if/elseif/else pour changer qu'une seule variable. Je trouve l'opérateur ternaire beaucoup plus efficace pour ca.
  • Si par contre, il y a d'autres chose à exécuter, l'opérateur ternaire n'est plus à utiliser !
  • Il faut savoir l'utiliser au moment opportun !
  • <?php
  • // Dernier exemple :
  • if( isset($_SERVER['HTTP_X_FORWARDED_FOR']) ) {
  • $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
  • } elseif ( isset($_SERVER['HTTP_CLIENT_IP']) ) {
  • $ip = $_SERVER['HTTP_CLIENT_IP'];
  • } else {
  • $ip = $_SERVER['REMOTE_ADDR'];
  • }
  • // Ou alors :
  • $ip = ( isset($_SERVER['HTTP_X_FORWARDED_FOR']) ) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : ( isset($_SERVER['HTTP_CLIENT_IP']) ) ? $_SERVER['HTTP_CLIENT_IP'] : $_SERVER['REMOTE_ADDR'];
  • ?>
<?php
// Imaginons que votre code est de ce type :
$var = 1;
$var2 = 0;
if ( $var === 0 ) {
     $truc = true;
} elseif ( $var2 === 0 ) {
     $truc = true;
} else {
     $truc = false;
}
// 6 lignes à écrire pour si peu ? Voici la version compactée :

$var = 1;
$var2 = 0;
$truc = ( $var === 0 ) ? true : ( $var2 === 0 ) ? true : false;

// Et oui, en une ligne, j'utilise 2 fois l'opérateur ternaire pour faire comme un if-elseif-else.
?>
<?php 
// ***************** Nouvel exemple un peu plus concret ! *******************
// Imaginons que vous souhaitez utiliser votre propre mode de session.
// Pour rappel, l'utilisation d'une session oblige à avoir un id de session pour pouvoir s'y retrouver.
// Cet id, soit on le fait passer par un cookie, soit par l'URL (jusqu'ici, rien de très compliqué )
// Ici, l'id sera stocké soit stocké dans un cookie ( $_COOKIE['session_id'] ), ou par passage dans l'url :
// xxx.php?sid=xopiasj53sdf2483sd453s5

 $sid = ( isset($_COOKIE['session_id']) ) ? $_COOKIE['session_id'] : ( isset($_GET['sid']) ) ? $_GET['sid'] : NULL;

?>
Après, il faut faire d'autres test pour valider l'id de session, mais ca je m'en fou, ce que je veux présenter, c'est l'emploi du double opérateur ternaire à la place d'un if/elseif/else.
Voila, l'exemple est un peu plus présentable je trouve.
Je redonne quand même le même exemple du dessus avec le vieux if/elseif/else :
<?php
 if ( isset($_COOKIE['session_id']) ) {
      $sid = $_COOKIE['session_id'];
 } elseid ( isset($_GET['sid'] ) {
      $sid = $_COOKIE['session_id'];
 } else {
      $sid = NULL;
 }
?>
Enfin, moi perso, je trouve rebarbatif d'utiliser if/elseif/else pour changer qu'une seule variable. Je trouve l'opérateur ternaire beaucoup plus efficace pour ca. 
Si par contre, il y a d'autres chose à exécuter, l'opérateur ternaire n'est plus à utiliser !
Il faut savoir l'utiliser au moment opportun !

<?php
// Dernier exemple :
   if( isset($_SERVER['HTTP_X_FORWARDED_FOR']) ) {
      $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
   } elseif ( isset($_SERVER['HTTP_CLIENT_IP']) ) {
      $ip  = $_SERVER['HTTP_CLIENT_IP'];
   } else {
      $ip = $_SERVER['REMOTE_ADDR'];
   }

// Ou alors :
 $ip = ( isset($_SERVER['HTTP_X_FORWARDED_FOR']) ) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : ( isset($_SERVER['HTTP_CLIENT_IP']) ) ? $_SERVER['HTTP_CLIENT_IP'] : $_SERVER['REMOTE_ADDR'];
?>

Conclusion

Cependant, niveau temps d'exécution, je sais que ca risque d'alourdir un peu la charge. De combien, je n'en sais rien.

Vous pouvez rajouter autant d'opérateur ternaire que de elseif à rajouter si jamais y'en a plus d'un !

Voila :)
Ps: je met ca en tant que Débutant, car c'est plus de la logique qu'autre chose. Même si l'opérateur ternaire est très rebutant au début (connaissance de cause :))
25 octobre 2005 01:02:42 :
J'ai oublié les balises php :p
25 octobre 2005 11:58:17 :
Correction et ajout d'un nouvel exemple un peu plus concret.
25 octobre 2005 14:56:39 :
Rajout d'un autre exemple basé sur l'adresse ip !

Sources en rapport avec celle ci

  • signaler à un administrateur
    Commentaire de sebmafate le 25/10/2005 06:12:34 administrateur CS

    d'un autre coté, ton code peut aussi s'écrire comme ceci :
    $truc = ( $var === 0 || $var2 === 0 );

    et je trouve ca plus propre...

  • signaler à un administrateur
    Commentaire de monoceros01 le 25/10/2005 06:56:44

    Mouahahah!
    Ouais utilises trois valeurs différentes pour $truc dans ton exemple sinon ça rime à rien :p

    Sinon c'est bien joli (j'ai utilisé cette syntaxe pour des trucs court), mais ça devient vite illisible/indigeste :)

    (Sinon ça aurait pas plutôt sa place dans "tuto" que dans "code" ce truc? :x)

  • signaler à un administrateur
    Commentaire de malalam le 25/10/2005 08:54:52 administrateur CS

    J'ai tâché de déplacer.

    T'as vraiment du temps à perdre, n'empêche, FhX, pour trouver des trucs pareils... ;-)

  • signaler à un administrateur
    Commentaire de coucou747 le 25/10/2005 10:16:27

    ça s'utilises dans un projet, mais ça, ça ne fait rien... c'est pas vraiment une source, juste un bout de tuto... Mais dans ce cas, il manque les explications et les benchs...

  • signaler à un administrateur
    Commentaire de Anthomicro le 25/10/2005 10:31:32

    Niveau benchs l'opérateur ternaire est légèrement derrière le if,elseif,else

    Sinon bah j'aurais mis ça dans les tutos aussi ;-)

  • signaler à un administrateur
    Commentaire de FhX le 25/10/2005 11:46:38

    Ouais, mon exemple est vraiment mal pris, car j'utilise true/false comme élément de réponse à mon opérateur.
    Mais jvais le refaire.
    Par contre, je savais pas trop où le mettre... code ou tuto :/ Alors je laisse le choix à notre cher Admin de le mettre la où il le veut ;)

    Et oui Malalam, j'ai du temps à perdre :) Enfin pas tout à fait, parce que j'utilise ce type d'opérateur pour ma propre gestion des sessions. Et l'opérateur ternaire n'a pas été crée que pour faire joli :)

  • signaler à un administrateur
    Commentaire de sebmafate le 25/10/2005 11:50:39 administrateur CS

    les admins ne peuvent pas modifier ce paramètre... C'est soit code, soit tuto.
    nous ne pouvons modifier que le titre et la catégorie des sources (et tuto). Accessoirement le flag indiquant que la source est en .net, mais ce ne vous concerne pas.

  • signaler à un administrateur
    Commentaire de FhX le 25/10/2005 12:16:31

    Pourtant, ma source est bien passé du coté tuto...Du moins sur cette page, mais pas sur la page index :/

  • signaler à un administrateur
    Commentaire de Anthomicro le 25/10/2005 12:18:36

    un problème de cache surement ;-)

  • signaler à un administrateur
    Commentaire de coockiesch le 26/10/2005 22:54:17

    Salut!
    Je trouve dommage d'avoir une source que pour ca... L'opérateur ternaire est assez simple et ton else if n'est qu'une imbrication. Et une fois qu'on a vu un exemple, on les a un peu tous vus...

    J'aurais préféré si c'était avec d'autres "astuces", etc...

    Anthomicro : "Niveau benchs l'opérateur ternaire est légèrement derrière le if,elseif,else"
    T'es sur, il me semblait que c'était là son intérêt principal, d'être plus rapide (en tout cas dans d'autres languages de prog). Je me trompe?

    @++

    R@f

  • signaler à un administrateur
    Commentaire de Anthomicro le 26/10/2005 22:57:44

    en php il est derrière ;-)

    www.vulgarisation-informatique.com/optimiser-php.php

  • signaler à un administrateur
    Commentaire de coockiesch le 26/10/2005 23:21:19

    Oh! Je m'y attendais pas! :)
    Bon, alors je suppose que j'ai vu ca en C++.

    Merci pour le lien! ( le $var1 = $var2 = $var3 = 1  m'a étonné aussi! )

    @++

    R@f

  • signaler à un administrateur
    Commentaire de FhX le 30/10/2005 20:26:45

    "L'opérateur ternaire est assez simple et ton else if n'est qu'une imbrication." Ah parce qu'un if/elseif/else peut faire autre chose qu'une imbrication ?
    Par contre, je tiens à te rassurer tout de suite, bon nombre de personnes ne comprennent pas l'utilisation de l'opérateur ternaire.
    En même temps, j'ai juste mis ca pour montrer que l'op ternaire peut faire autre chose qu'un if/else standard et qu'il peut aussi faire du if/elseif/elseif/else par exemple, ce dont bon nombre n'ont peut-être jamais pensé à faire quand il y a des conditions qui sont simples.

    "( le $var1 = $var2 = $var3 = 1  m'a étonné aussi! )"
    Non, pas pour moi. Etant donnée que PHP interprète au fur et à mesure :
    -> Création de $var1.
    -> Valeur de $var1 = $var2.
    -> $var2 n'existe pas. Création de $var2.
    -> Valeur de $var2 = $var3.
    -> $var3 n'existe pas. Création de $var3.
    -> Valeur de $var3 = 1.
    -> Donc, $var2 = $var3 = 1.
    -> $var1 = $var2 = 1.

    Ce type d'écriture est d'autant plus long qu'il y a de variable en plus.
    Bah voui, PHP ne lit pas à l'envers :D

  • signaler à un administrateur
    Commentaire de Anthomicro le 30/10/2005 20:50:41

    "Non, pas pour moi. Etant donnée que PHP interprète au fur et à mesure :"

    justement, en toute logique

    $var1=$var2=$var3=1; devrait être plus rapide que

    $var1=1;
    $var2=1;
    $var3=1;

  • signaler à un administrateur
    Commentaire de FhX le 30/10/2005 21:21:44

    Non, bien au contraire !

    Il est beaucoup plus facile de créer directement une variable par sa valeur plutot que de créer une variable qui aura pour valeur une autre variable qui elle-même aura pour valeur une autre variable etc...

    C'est de l'interprétation à la volée, chose qui n'existe pas quand on compile.
    Voila pourquoi assigner une valeur à une variable une par une est plus rapide que d'assigner la même valeur à un paquet de variables :)

    Question de raisonnement :)

  • signaler à un administrateur
    Commentaire de Anthomicro le 30/10/2005 21:26:27

    "Question de raisonnement :)"

    effectivement, pour moi quand je vois que $var=$var2=$var3=1 c'est plus rapide pour moi que de voir

    $var=1;
    $var2=1;
    $var3=1;

    etc... après c'est sûr que bon c'est comme pour le reste, certains sont rapides sur une méthode au contraire des autres et inversement qui préfèrent une autre méthode ;-)

  • signaler à un administrateur
    Commentaire de FhX le 30/10/2005 22:32:36

    Pour toi c'est plus rapide pour l'oeil :) Pas pour l'interpréteur qui doit se taper une ligne entière pour connaitre la valeur de $var1 par exemple :)

    Pour nous, c'est très logique donc très rapide. Pour l'interpréteur non, car plus la ligne est grande, plus elle est plus longue à examiner.

    C'est pareil pour l'opérateur ternaire. Il est plus lent car tout ce fait en une ligne (condition, résultat vrai, résultat faux), donc tout doit être pris en compte. Hors, un vieux if() ira plus vite car il ne prendra en compte que le bon résultat (qu'il soit vrai ou faux).

    Voila pourquoi :)

  • signaler à un administrateur
    Commentaire de Anthomicro le 30/10/2005 23:04:07

    Ce que je veux dire par là c'est que l'interpréteur n'est pas forcément logique par rapport à l'humain ;-)

  • signaler à un administrateur
    Commentaire de FhX le 31/10/2005 10:42:55

    La dessus on est d'accord :)

  • signaler à un administrateur
    Commentaire de coolmanin25 le 01/11/2005 19:01:14

    Je comprends pas grand chose lol

  • signaler à un administrateur
    Commentaire de FhX le 02/11/2005 11:16:00

    J'aurais du être plus précis :

    L'opérateur ternaire fonctionne comme ca :

    $var = ( condition ) ? condition-vrai : condition-fausse;

    Un peu comme un if/else
    if ( condition ) {
         condition-vrai;
    } else {
         condition-fausse;
    }

    Et bien maintenant, j'utilise l'opérateur ternaire pour faire un if/elseif/else :

    $var = ( condition ) ? condition-vrai : ( condition2 ) ? condition-2 vrai : condition-2 fausse;

    Ce qui revient à :
    if ( condition ) {
         condition-vrai;
    }elseif ( condition2 ) {
         condition2-vrai
    }else {
         condition2-fausse;
    }

    Voila !

  • signaler à un administrateur
    Commentaire de Andrei2006 le 31/05/2006 03:49:54

    Mouais... perso je suis contre les ternaires :

    1) Ton code deviens ilisible. Franchement des ? puis des : c'est pas très rassurant :)

    2) (et c'est prouvé :) Les blocs conditionels "classiques" et les switch-case sont plus rapides que les ternaires :D
    http://www.vulgarisation-informatique.com/optimiser-php.php

  • signaler à un administrateur
    Commentaire de Anthomicro le 31/05/2006 19:33:37

    Merci pour la citation de mon article ^^

    beau déterrage au passage :)

  • signaler à un administrateur
    Commentaire de coockiesch le 01/06/2006 20:28:21

    "Merci pour la citation de mon article ^^

    beau déterrage au passage :)"
    Si c'est pas du flood, ca...

    @++

    R@f

  • signaler à un administrateur
    Commentaire de coucou747 le 01/06/2006 20:34:55

    des remerciements, c'est pas du tout du flood...

Ajouter un commentaire

Pub



Appels d'offres

Dessins techniques
Budget : 60€
Animation Flash - Doma...
Budget : 370€
Application flash medi...
Budget : 1 000€

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Boutique

Boutique de goodies CodeS-SourceS