¿Cómo utilizo el operador ternario (?:) En PHP como abreviatura de "si / si no"?

118

Según los ejemplos de esta página , tengo los ejemplos de código que funcionan y que no funcionan a continuación.

Código de trabajo usando ifdeclaración:

if (!empty($address['street2'])) echo $address['street2'].'<br />';

Código que no funciona con operador ternario:

$test = (empty($address['street2'])) ? 'Yes <br />' : 'No <br />';

// Also tested this
(empty($address['street2'])) ? 'Yes <br />' : 'No <br />';

ACTUALIZACIÓN
Después de la sugerencia de Brian, descubrí que hacer eco $testgenera el resultado esperado. ¡Lo siguiente funciona como un encanto!

echo (empty($storeData['street2'])) ? 'Yes <br />' : 'No <br />';
Steven
fuente
4
Parece correcto. ¿Ha intentado hacer eco de $ test ;?
Brian Fisher
Su pregunta está engañando a algunos voluntarios e investigadores porque no está escribiendo una tarea usando una expresión ternaria taquigráfica (no hay "Operador Elvis") - está escribiendo una expresión ternaria taquigráfica. La diferencia es que está declarando ambos valores devueltos según la evaluación. En una evaluación abreviada, si el valor de entrada es "verdadero", se devuelve; si es "falsey", se devuelve el valor de reserva (este es el valor declarado después del operador de Elvis). Aquí también hay una implementación notablemente pobre del Operador Coalescente Nulo.
mickmackusa

Respuestas:

234

los

(condition) ? /* value to return if condition is true */ 
            : /* value to return if condition is false */ ;

la sintaxis no es un operador "taquigráfico si" (el ?se llama operador condicional) porque no puede ejecutar código de la misma manera que si lo hiciera:

if (condition) {
    /* condition is true, do something like echo */
}
else {
    /* condition is false, do something else */
}

En su ejemplo, está ejecutando la echoinstrucción cuando $addressno está vacío. No puede hacer esto de la misma manera con el operador condicional. Sin embargo, lo que puede hacer es echoel resultado del operador condicional:

echo empty($address['street2']) ? "Street2 is empty!" : $address['street2'];

y esto mostrará "¡La calle está vacía!" si está vacío, de lo contrario mostrará la dirección street2.

John Rasch
fuente
Es la diferencia entre declaración y expresión
pmiranda
2
¿Cuál es la taquigrafía de nuevo? condition ?: falseque evalúa conditionsi es cierto?
oldboy
44

PHP 7+

A partir de PHP 7, esta tarea se puede realizar simplemente usando el operador coalescente Null como este:

echo !empty($address['street2']) ?? 'Empty';

Rabin Lama Dong
fuente
3
Solo para su información, si $address['street2']es una cadena vacía. Lo aceptará y no regresará 'Empty'. isset() != empty(). Esto solo funcionará si el valor esnull
AFwcxx
Bueno, solo estaba dando un ejemplo. Pero modifiqué el código. Gracias !
Rabin Lama Dong
2
¿Cuál es la salida si $address['street2']no está vacía?
AliN11
Si $ address ['street2'] no está vacío, generará alguna forma de "verdadero". La forma habitual de lo anterior es más como: echo $address['street2'] ?? 'Empty';sin embargo, como se mencionó, es el " operador de fusión nula ", por lo que solo prueba nulo y no vacío. Esto es porque ?? Es efectivamente una abreviatura de isset ().
Brian C
1
Accedí solo para rechazar esta respuesta. Esto no hace nada de lo que se anuncia.
TKoL
28

Declaración básica de verdadero / falso

$is_admin = ($user['permissions'] == 'admin' ? true : false);

Mensaje de bienvenida condicional

echo 'Welcome '.($user['is_logged_in'] ? $user['first_name'] : 'Guest').'!';

Mensaje de elementos condicionales

echo 'Your cart contains '.$num_items.' item'.($num_items != 1 ? 's' : '').'.';

ref: https://davidwalsh.name/php-ternary-examples

Arun Yokesh
fuente
2
lo obtuvo del sitio web abreviado y ni siquiera hizo referencia a él
Richard
1
@Richard agregó referencias
Arun Yokesh
Lo es ? En el contexto de StackOverflow, siempre es una línea delgada, me refiero a que Q pidió algo, no pudo encontrarlo por sí mismo, y luego alguien más entregó este contenido. ¿Es injusto copiar contenido existente si ayuda y agrega valor a esta Q / A? Creo que las respuestas en StackOverflow no son "su propio contenido" ... hmmm
Sliq
El primer ejemplo es incorrecto. El )está fuera de lugar. Debería preceder al ?. La declaración completa debería ser$is_admin = ($user['permissions'] == 'admin') ? true : false;
1934286
12

El operador ternario es solo una abreviatura de un bloque if / else. Su código de trabajo no tiene una condición else, por lo que no es adecuado para esto.

El siguiente ejemplo funcionará:

echo empty($address['street2']) ? 'empty' : 'not empty';
adrianbanks
fuente
6

Es el operador ternario también conocido como operador Elvis (google it: P) que está buscando.

echo $address['street2'] ?: 'Empty'; 

Devuelve el valor de la variable o por defecto si la variable está vacía.

Ninja del teclado
fuente
@Structed No puedo estar en desacuerdo con lo que dices, pero buscar esto en Google te dará el resultado adecuado y es un término más fácil de recordar
Teclado ninja
4

Tenga en cuenta que cuando utilice operadores condicionales anidados, es posible que desee utilizar paréntesis para evitar posibles problemas.

Parece que PHP no funciona de la misma manera que al menos Javascript o C #.

$score = 15;
$age = 5;

// The following will return "Exceptional"
echo 'Your score is: ' . ($score > 10 ? ($age > 10 ? 'Average' : 'Exceptional') : ($age > 10 ? 'Horrible' : 'Average'));

// The following will return "Horrible"
echo 'Your score is: ' . ($score > 10 ? $age > 10 ? 'Average' : 'Exceptional' : $age > 10 ? 'Horrible' : 'Average');

El mismo código en Javascript y C # devuelve "Excepcional" en ambos casos.

En el segundo caso, lo que hace PHP es (o al menos eso es lo que entiendo):

  1. es $score > 10? si
  2. es $age > 10? no, entonces la corriente $age > 10 ? 'Average' : 'Exceptional'devuelve 'Excepcional'
  3. luego, en lugar de simplemente detener toda la declaración y devolver 'Excepcional', continúa evaluando la siguiente declaración
  4. la siguiente declaración se convierte en lo 'Exceptional' ? 'Horrible' : 'Average'que devuelve 'Horrible', ya que 'Excepcional' es verdad

De la documentación: http://php.net/manual/en/language.operators.comparison.php

Se recomienda evitar "apilar" expresiones ternarias. El comportamiento de PHP cuando se usa más de un operador ternario dentro de una sola declaración no es obvio.

usuario276648
fuente
3

Manera rápida y corta:

echo $address['street2'] ? : "No";

Aquí hay algunos ejemplos interesantes, con una o más condiciones variadas.

$color = "blue";

// Condition #1 Show color without specifying variable 
echo $color ? : "Undefined";
echo "<br>";

// Condition #2
echo $color ? $color : "Undefined";
echo "<br>";

// Condition #3
echo ($color) ? $color : "Undefined";
echo "<br>";

// Condition #4
echo ($color == "blue") ? $color : "Undefined";
echo "<br>";

// Condition #5
echo ($color == "" ? $color : ($color == "blue" ? $color : "Undefined"));
echo "<br>";

// Condition #6
echo ($color == "blue" ? $color : ($color == "" ? $color : ($color == "" ? $color : "Undefined")));
echo "<br>";

// Condition #7
echo ($color != "") ? ($color != "" ? ($color == "blue" ? $color : "Undefined") : "Undefined") : "Undefined";
echo "<br>";
Aprendiendo y compartiendo
fuente
2

Mensaje de bienvenida condicional

echo 'Welcome '.($user['is_logged_in'] ? $user['first_name'] : 'Guest').'!';

Taquigrafía PHP anidada

echo 'Your score is:  '.($score > 10 ? ($age > 10 ? 'Average' : 'Exceptional') : ($age > 10 ? 'Horrible' : 'Average') );
Adnan
fuente
2

Puede hacer esto aún más corto reemplazando echocon<?= code ?>

<?=(empty($storeData['street2'])) ? 'Yes <br />' : 'No <br />'?>

Esto es útil especialmente cuando desea determinar, dentro de una barra de navegación, si la opción del menú debe mostrarse como ya visitada (presionada) o no:

<li<?=($basename=='index.php' ? ' class="active"' : '')?>><a href="index.php">Home</a></li>

Pathros
fuente
¿Se necesitan () en ese método <? =?>?
rizos
0

Creo que usaste los corchetes de manera incorrecta. Prueba esto:

$test = (empty($address['street2']) ? 'Yes <br />' : 'No <br />');

Creo que debería funcionar, también puedes usar:

echo (empty($address['street2']) ? 'Yes <br />' : 'No <br />');
usuario2909855
fuente
0

Creo que probablemente no deberías usar el operador ternario en php. Considere el siguiente ejemplo:

<?php

function f1($n) {
    var_dump("first funct");
    return $n == 1;
}

function f2($n) {
    var_dump("second funct");
    return $n == 2;
}


$foo = 1;
$a = (f1($foo)) ? "uno" : (f2($foo)) ? "dos" : "tres";
print($a);

¿Cómo crees, qué $avariable contendrá? (pista: dos) Y seguirá siendo el mismo incluso si$foo variable se asignará a 2.

Para mejorar las cosas, debe negarse a usar este operador o rodear la parte derecha con llaves de la siguiente manera:

$a = (f1($foo)) ? "uno" : ((f2($foo)) ? "dos" : "tres");
rela589n
fuente
0

Ternary Operator es básicamente una abreviatura de la declaración if / else. Podemos utilizar para reducir pocas líneas de código y aumentar la legibilidad.

Tu código me parece más limpio. Pero podemos agregar una forma más limpia de la siguiente manera:

$test = (empty($address['street2'])) ? 'Yes <br />' : 'No <br />';

De otra manera-

$test = ((empty($address['street2'])) ? 'Yes <br />' : 'No <br />');

Nota: he añadido corchetes a toda la expresión para que quede más limpia. Solía ​​hacer esto normalmente para aumentar la legibilidad. Con PHP7 podemos usar Null Coalescing Operator / php 7 ?? operador para un mejor enfoque. Pero su requisito no encaja.

Excepción
fuente
-1

También hay un operador ternario taquigráfico y se ve así:

(expresión1)?: expresión2 devolverá expresión1 si se evalúa como verdadero o expresión2 en caso contrario.

Ejemplo:

$a = 'Apples';
echo ($a ?: 'Oranges') . ' are great!';

volverá

Apples are great!

Desde PHP 5.3, es posible omitir la parte central del operador ternario. Expresión expr1?: Expr3 devuelve expr1 si expr1 se evalúa como VERDADERO y expr3 en caso contrario.

Del manual de PHP

horas_ro
fuente