2011-06-01 222 views
12

Uso mucho los operadores ternarios, pero parece que no puedo apilar varios operadores ternarios uno dentro del otro.¿Cómo concatenar múltiples operadores ternarios en PHP?

Soy consciente de que apilar múltiples operador ternario sería que el código sea menos legible pero en algún caso me gustaría gustaría hacerlo.

Esto es lo que he probado hasta ahora:

$foo = 1; 
$bar = ($foo == 1) ? "1" : ($foo == 2) ? "2" : "other"; 
echo $bar; // display 2 instead of 1 

¿Cuál es la sintaxis correcta?

+0

posible duplicado de [php problemas ternarios anidada: salida ternaria = si - los demás] (http://stackoverflow.com/questions/4807454/nested -php-ternary-trouble-ternary-output-if-else) –

+0

Excelente respuesta para todos. – Cybrix

Respuesta

17

Esos paréntesis son lo que creo que está recibiendo.

Trate

$foo = 1; 
$bar = ($foo == 1) ? "1" : (($foo == 2) ? "2" : "other"); 
echo $bar; 
3

paréntesis poner alrededor de cada operador ternario interior, esta prioridad operador manera se asegura:

$bar = ($foo == 1) ? "1" : (($foo == 2) ? "2" : "other"); 
2

Añadir el paréntesis:

$bar = ($foo == 1) ? "1" : (($foo == 2) ? "2" : "other"); 
4

Se puede escribir esto correctamente así:

$bar = ($foo == 1) ? "1" : (($foo == 2) ? "2" : "other"); 

(es decir: Basta con insertar el operador 'interior' ternaria entre paréntesis .)

Sin embargo, estaría realmente tentado de no hacer esto, ya que es tan legible como una cosa particularmente ilegible que ha sido muy manchada: nunca hay ninguna excusa para ofuscar el código, y esto raya en ello.

16

El problema es que PHP, a diferencia de todos los demás lenguajes, hace que el operador condicional sea asociativo. Esto rompe su código, lo que estaría bien en otros idiomas.

Es necesario utilizar paréntesis:

$bar = $foo == 1 ? "1" : ($foo == 2 ? "2" : "other"); 

(. Tenga en cuenta que me he quitado los demás paréntesis, a partir de su código; pero éstas eran correctas, simplemente redundante)

+1

"_Tenga en cuenta que he eliminado los otros paréntesis de su código, pero estos eran correctos, simplemente redundantes_" - pero con un analizador así, nunca se puede estar seguro ... ;-) – Alnitak

8

Es necesario algunos paréntesis alrededor de la derecho operando mano:

$foo = 1; 
$bar = ($foo == 1) ? "1" : (($foo == 2) ? "2" : "other"); 
echo $bar; 

intérprete de PHP se ha roto, y trata a su línea:

$bar = ($foo == 1) ? "1" : ($foo == 2) ? "2" : "other"; 

como

$bar = (($foo == 1) ? "1" : ($foo == 2)) ? "2" : "other"; 

y desde que la expresión de la mano izquierda se evalúa como "verdadero", el primer operando del operador ternario restante ("2") se devuelve en su lugar.

+0

-1 ¿Roto? El analizador se comporta exactamente como se define en la descripción de precedencia y asociatividad del operador de PHP: http://php.net/manual/en/language.operators.precedence.php – NikiC

+2

@nikic El manual de PHP documentó la implementación: los documentos no definen la implementación. , ya que PHP nunca tuvo una especificación formal. La implementación se rompe (es decir, diferente) cuando se compara con cualquier otro lenguaje que admita el operador ternario. – Alnitak

+0

Si quisiste decir que era diferente a lo que estás acostumbrado, ¿por qué no decir solo eso? – NikiC

2

Sólo apilar hasta el paréntesis, y lo tienes:

$bar = ($foo==1? "1" : ($foo==2? "2" : "other")); 

Como acotación al margen, si usted tiene muchas cláusulas, se debe considerar el uso de un switch:

switch ($bar) { 
    case 1: echo "1"; 
    case 2: echo "2"; 
    default: echo "other"; 
} 

Si el interruptor se alarga, puede envolverlo en una función.

2
$foo = 1; 
$bar = ($foo == 1) ? "1" : (($foo == 2) ? "2" : "other"); 
echo $bar; 

sólo tiene que utilizar extra() y funcionará

Cuestiones relacionadas