2013-07-31 6 views
39

Come si scrive un operatore ternario PHP con la parte elseif?Come scrivere un operatore ternario PHP

vedo esempi di base con le if e else porzioni del PHP operatore ternario come questo:

echo (true) ? "yes" : "no"; //prints yes 
echo (false) ? "yes" : "no"; //prints no 

Come faccio ad avere la parte "ElseIf" come questo in l'operatore ternario?

<?php 
    if($result->vocation == 1){ 
    echo "Sorcerer"; 
    }else if($result->vocation == 2){ 
    echo 'Druid'; 
    }else if($result->vocation == 3){ 
    echo 'Paladin'; 
    }else if($result->vocation == 4){ 
    echo 'Knight'; 
    }else if($result->vocation == 5){ 
    echo 'Master Sorcerer'; 
    }else if($result->vocation == 6){ 
    echo 'Elder Druid'; 
    }else if($result->vocation == 7){ 
    echo 'Royal Paladin'; 
    }else{ 
    echo 'Elite Knight'; 
    } 
?> 
+3

Sarebbe meglio usare un interruttore o, ancora meglio, una mappa di ricerca di array. Un ternario per definizione è se-allora-altro. Scrivere un ternario per provare e fare ciò che vuoi sarebbe molto difficile da leggere/seguire. –

+0

@ cale_b Potrebbe chiarire un po '? Sto ancora imparando PHP e nel mio lavoro ho usato solo istruzioni if-else-else, quindi non sono così familiare con tutte queste cose. – dinomuharemagic

+0

Ho dato un esempio qui sotto. Se non hai intenzione di utilizzare un database, questa soluzione è chiara e facile da capire. –

risposta

75

Un ternario non è una buona soluzione per quello che vuoi. Non sarà leggibile nel tuo codice e ci sono soluzioni molto migliori disponibili.

Perché non utilizzare una ricerca di matrice "mappa" o "dizionario", in questo modo:

$vocations = array(
    1 => "Sorcerer", 
    2 => "Druid", 
    3 => "Paladin", 
    ... 
); 

echo $vocations[$result->vocation]; 

A ternaria per questa applicazione potrebbe finire per assomigliare a questo:

echo($result->group_id == 1 ? "Player" : ($result->group_id == 2 ? "Gamemaster" : ($result->group_id == 3 ? "God" : "unknown"))); 

Perché è questo cattivo? Perché - come una singola linea lunga, non si otterrebbero informazioni di debug valide se qualcosa dovesse andare storto qui, la lunghezza rende difficile la lettura, in più l'annidamento dei molteplici ternari sembra strano.

A Standard Ternario è semplice, facile da leggere, e sarebbe simile a questa:

$value = ($condition) ? 'Truthy Value' : 'Falsey Value'; 

o

echo ($some_condition) ? 'The condition is true!' : 'The condition is false.'; 

Un ternario è in realtà solo un/modo conveniente più breve per scrivere un semplice dichiarazione if else. Il ternario esempio sopra riportato è lo stesso:

if ($some_condition) { 
    echo 'The condition is true!'; 
} else { 
    echo 'The condition is false!'; 
} 

Tuttavia, un ternario per una logica complessa diventa rapidamente illeggibile, e non più vale la brevità.

echo($result->group_id == 1 ? "Player" : ($result->group_id == 2 ? "Gamemaster" : ($result->group_id == 3 ? "God" : "unknown"))); 

Anche con un po 'di formattazione attento alle distese su più righe, non è molto chiaro:

echo($result->group_id == 1 
    ? "Player" 
    : ($result->group_id == 2 
     ? "Gamemaster" 
     : ($result->group_id == 3 
      ? "God" 
      : "unknown"))); 
+0

+1 per dizionario! Perfetto per questa situazione! –

+0

Grazie. È semplice e pulito per la configurazione. +1! Devo aspettare 5 minuti per accettare la risposta, quindi .. – dinomuharemagic

+2

"Un ternario non è una buona soluzione per quello che vuoi.", Spiega perché ... (so perché, ma la risposta ha bisogno di quell'informazione) – bizzehdee

3

Non si: è disordinato e difficile da leggere.

Stai cercando l'istruzione switch nel primo caso. Il secondo va bene, ma può essere convertito per coerenza

Le dichiarazioni ternarie sono molto più adatte ai valori booleani e alla logica alternata.

7
echo ($result ->vocation == 1) ? 'Sorcerer' 
     : ($result->vocation == 2) ? 'Druid' 
      : ($result->vocation == 3) ? 'Paladin' 
        .... 

; 

È un po 'brutto. È necessario attenersi alle normali dichiarazioni if.

+3

Brutto, ma a volte utile. Non per una cosa di queste dimensioni, ovviamente. – MightyPork

+2

Puoi per favore rimuovere quello spazio prima della prima freccia? Non è possibile modificare meno di 6 caratteri. –

3

Per essere onesti, un operatore ternario ha preso questa peggio, quello che vorrei suggerire se fare più semplice è quello che si sta puntando a è:

$groups = array(1=>"Player", 2=>"Gamemaster", 3=>"God"); 
echo($groups[$result->group_id]); 

e poi uno simile per le vocazioni

$vocations = array(
    1=>"Sorcerer", 
    2=>"Druid", 
    3=>"Paladin", 
    4=>"Knight", 
    .... 
); 
echo($vocations[$result->vocation]); 

Con un operatore ternario, si finirebbe con

echo($result->group_id == 1 ? "Player" : ($result->group_id == 2 ? "Gamemaster" : ($result->group_id == 3 ? "God" : "unknown"))); 

Che, come si può dire, solo diventa più complicato e più si aggiunge ad esso

3

Preferirei che se- ternario le dichiarazioni vanno con un interruttore. Per esempio:

switch($result->vocation){ 
case 1: 
    echo "Sorcerer"; 
    break; 
case 2: 
    echo "Druid"; 
    break; 
case 3: 
    echo "Paladin"; 
    break; 
case 4: 
    echo "Knight"; 
    break; 
case 5: 
    echo "Master Sorcerer"; 
    break; 
case 6: 
    echo "Elder Druid"; 
    break; 
case 7: 
    echo "Royal Paladin"; 
    break; 
default: 
    echo "Elite Knight"; 
    break; 
} 
2

In aggiunta a tutte le altre risposte, è possibile utilizzare switch. Ma sembra un po 'lungo.

switch ($result->vocation) { 
case 1: 
    echo 'Sorcerer'; 
    break; 

case 2: 
    echo 'Druid'; 
    break; 

case 3: 
    echo 'Paladin'; 
    break; 

case 4: 
    echo 'Knight'; 
    break; 

case 5: 
    echo 'Master Sorcerer'; 
    break; 

case 6: 
    echo 'Elder Druid'; 
    break; 

case 7: 
    echo 'Royal Paladin'; 
    break; 

default: 
    echo 'Elite Knight'; 
    break; 
} 
8

Poiché questo sarebbe un compito comune, suggerirei di inserire un interruttore/caso all'interno di una chiamata di funzione.

function getVocationName($vocation){ 
    switch($vocation){ 
     case 1: return "Sorcerer"; break; 
     case 2: return 'Druid'; break; 
     case 3: return 'Paladin'; break; 
     case 4: return 'Knight'; break; 
     case 5: return 'Master Sorcerer'; break; 
     case 6: return 'Elder Druid'; break; 
     case 7: return 'Royal Paladin'; break; 
     default: return 'Elite Knight'; break; 
    } 
} 

echo getVocationName($result->vocation); 
+19

le interruzioni sono ridondanti quando si utilizza 'return'. – mpen

4

Come scrivere un semplice PHP Ternario Operatore:

($your_boolean) ? 'This is returned if true' : 'This is returned if false'; 

Esempio:

$myboolean = true; 
echo ($myboolean) ? 'foobar' : "penguin"; 
foobar 

echo (!$myboolean) ? 'foobar' : "penguin"; 
penguin 

Un PHP operatore ternario con una 'elseif' stipati in là:

$chow = 3; 
echo ($chow == 1) ? "one" : ($chow == 2) ? "two" : "three"; 
three 

Ma per favore non annidare gli operatori ternari ad eccezione dei trucchi da salotto. È un cattivo odore di codice.

+0

Questo risponde alla domanda originale, che era scarsamente intitolata. – dreftymac