En ocasiones queremos introducir sentencias condicionales en una sola línea, pero si usamos una sentencia if
, puede que tengamos que usar varias líneas para que la legibilidad de nuestro código sea la adecuada. Sin embargo podemos usar el operador ternario en PHP, que se comporta exactamente igual que una sentencia if
con else
.
Contenidos
Qué es el operador ternario
El operador ternario es la forma corta de la sentencia if { ... } else { ... }
, por lo que en lugar de escribir el código del siguiente ejemplo:
if ($condicion) {
$resultado = 'verdadero';
} else {
$resultado = 'falso';
}
Podríamos usar el operador ternario de este modo:
$resultado = $condicion ? 'verdadero' : 'falso';
Si la variable $condicion
se evalúa como true
, el operando de la izquierda 'verdadero'
será asignado a la variable $resultado
. Si por el contrario la variable $condicion
se evalúa como false
, se asignará el operando de la derecha 'falso'
.
El nombre del operador ternario significa «operador que funciona con tres operandos». Se denomina operando a cada parte de la expresión, siendo el operador ternario el único operador de PHP que necesita tres operandos, que son la condición, el resultado que se asignará si es cierta y el resultado que se asignará si es falsa. Si no tienes claro qué expresiones devolverán true
o false
en PHP, consulta esta tabla.
Sintaxis del operador ternario
El operador ternario existe en muchos lenguajes de programación y sirve para que, dada una condición, ejecutar una sentencia o devolver un valor si se cumple dicha condición. Si no se cumple la condición, se devolverá otro valor o se ejecutará otra sentencia.
La sintaxis genérica y común a todos los lenguajes es la siguiente:
sentencia_booleana ? valor_si_verdadero : valor_si_falso
Operador ternario abreviado
Desde PHP 5.3 es posible omitir el operador de la izquierda, pudiendo acortar ciertas expresiones de siguiente modo:
$resultado = $valor ?: 'defecto';
En este caso, el valor que tendrá la variable $resultado
será el valor de la variable $valor
a no ser que la variable $valor
se evalúe como falsa, en cuyo caso pasará a tomar el valor 'defecto'
.
Si usásemos la forma normal del operador ternario, la expresión anterior sería equivalente a la siguiente:
$resultado = $valor ? $valor : 'defecto';
Operadores ternarios encadenados
También podemos encadenar varios operador ternarios, aunque no funcionará igual que en otros lenguajes de programación como JavaScript, ya que en PHP, el operador ternario es asociativo por la izquierda. Vamos a poner el siguiente ejemplo:
$resultado = $condicion ? 'verdadero' : $condicion2 ? 'verdadero2' : 'falso';
Por lógica, pensarías que primero se evalúa la variable $condicion
, devolviendo el valor 'verdadero'
si se cumple. Sin embargo, lo que ocurre en realidad es que $condicion2
se evalúa primero. Por ello, aunque $condicion
se evalúe como true
y $condicion2
sea false
, el resultado será 'verdadero2'
.
La buena noticia es que no tienes que entenderlo, ya que desde PHP 7.4 los paréntesis son obligatorios debido a la confusión que esto generaba, por lo que la expresión anterior devolverá un error. La forma correcta es la siguiente:
$resultado = $condicion ? 'verdadero' : ($condicion2 ? 'verdadero2' : 'falso');
En efecto, ahora si $condicion
se evalúa como true
, el resultado será siempre 'verdadero'
.
Ejemplos de uso en PHP
Vamos a ver un simple ejemplo en el que usamos dos condiciones:
$a = 2; $b = 1;
if ($a > $b) { $resultado = true; } else { $resultado = false; } echo($resultado); // true
Para obtener el mismo resultado usando el operador ternario tendríamos que escribir el código anterior de este modo:
$a = 2;
$b = 1;
$resultado = $a > $b ? true : false;
echo($resultado); //true
También es muy habitual usar el operador ternario para mostrar texto en pantalla:
$a = 2;
$b = 1;
echo ($a > $b ? 'a es mayor que b' : 'a es menor o igual que b');
Alternativamente también podemos usar esta expresión:
echo ($a > $b) ? 'A es mayor que B' : 'A es menor o igual que B';
Espero que os haya sido útil a los que estéis comenzando con PHP y también a los que no en caso de no utilizar demasiado este operador.
Y esto ha sido todo.
Buen artículo para los que no lo conocieran, venia buscando un ejemplo en el que lo usaras con un «operador estricto» (no se si se llaman así). Me explico:
– Este caso falla, siempre se da la condición negativa:
($variable === 0) ? «Es cero» : «No es cero»;
– Este caso funciona:
($variable == 0) ? «Es cero» : «No es cero»;
Falla porque tu variable tiene 0 como string ejem.
$variable = «0»;
cuando usas el operador de identidad (===), este evalúa que sean iguales, pero también que sean del mismo tipo. Por eso te devuelve error cuando lo usas.
//esto te devuelve si
$var = 0;
echo ($var === 0) ? "si" : "no";
Añadir que en PHP también se puede resumir omitiendo el valor del medio. De esta forma expresión1 ? : expresión3 retorna expresión1 si es verdadero, y expresión3 de otra forma.
muchas gracias
Gracias por vuestros comentarios. Artículo actualizado tras los cambios introducidos desde PHP 7.4.
$resultado = $condicion ? ‘verdadero’ : $condicion2 ? ‘verdadero2’ : ‘falso’;
En este caso si $condicion es True y condicion2 es false comentas que el resultado es Verdadero2 pero no lo entiendo por que si primero analiza $condicion2 y $condicion2 es false debería saltar el else, es decir falso. ¿podrias explicarlo? gracias
Creo que a todos nos parece algo engorroso. Ahora mismo los paréntesis son obligatorios, por lo que la expresión fallaría. Sin embargo, en versiones previas a PHP 7.4, la expresión sería equivalente a esta:
$resultado = ($condicion ? 'verdadero' : $condicion2) ? 'verdadero2' : 'falso';
Si $condicion es true y condicion2 es false, quedaría esta expresión:
$resultado = (true ? 'verdadero' : false) ? 'verdadero2' : 'falso';
Tal y como ves, la primera expresión entre paréntesis dará como resultado ‘verdadero’, por lo que nos quedaría lo siguiente:
$resultado = 'verdadero' ? 'verdadero2' : 'falso';
Dado que ‘verdadero’ se evalúa como true, el resultado será ‘verdadero2’.
como puedo hacer un else if con 7 opciones ? estoy un poco enredado
de manera abreviada, a eso me refiero, gracias.
posiblemente la mejor solucion sea meter un switch case
La verdad, no recomiendo este operador ternario para eso (aunque se pueda) ya que la idea es hacer un código limpio y legible, con 7, ya de legible no tendrá nada.
Luego, puede ser con if anidados o con switch, pero la verdad, a ser posible, en esa cantidad, ya trato de usar un arreglo y un in_array o algo de ese estilo.
Saludos
El operador ?? no pertenecería a este grupo?
Digamos:
$a = $b ?? $c ?? $d;
Donde $a toma el primer valor que no sea null de izquierda a derecha. Ahora no sabría si llamarlo una forma resumida del ternario o un lógico. Me parece que ternario ya que en PHP una operación lógica debe devolver lógico también, y en este caso es un valor lo que se asigna a $a.
Esta sentencia
$resultado = $a > $b ? true : false;
Se puede reducir a:
$resultado = $a > $b;
Ya que la evaluación devolverá un booleano.
Saludos