2009-07-16 25 views
5

Quiero establecer una variable a un valor, pero solo si una condición es verdadera.
En vez de hacer lo siguiente:Operador condicional con solo una declaración verdadera

if($myarray["foo"]==$bar){ 
    $variablename=$myarray["foo"]; 
} 

Esto puede llegar a ser bastante largo, si los nombres de las variables son largos, o tal vez se trata de matrices, cuando es bastante simple lo que quiero hacer — establecer un valor si una la condición es verdadera.

me gustaría usar el operador condicional, algo como esto:

$variablename=($myarray["foo"]=="bar")? $myarray["foo"]...... 

Pero esto falla porque No quieren que la variable que se ajusta en absoluto si la afirmación es falsa.

Básicamente, lo que intento hacer es acortar el primer ejemplo. Quizás el operador condicional no es el camino aunque ...

¿Alguien tiene alguna sugerencia?

+0

Su segundo ejemplo de código no es realmente más corto que el primero (si elimina los saltos de línea y las llaves en el primero). Todavía hace referencia a la matriz dos veces ... ¿qué espera obtener exactamente de esto? –

Respuesta

-1

Establecer la variable a sí mismo en el caso falso:

$variablename=($myarray["foo"]=="bar")? $myarray["foo"] : $variablename 
+1

¿Por qué el downvot? esto es perfectamente válido – Draemon

+0

no sé, también tengo uno para el mismo código. – jjnguy

+0

No es válido, hay una gran posibilidad de que genere un aviso. –

7

OMI, la mejor manera de hacer que su ejemplo de código más corta es:

if($myarray["foo"] == $bar) 
    $variablename = $myarray["foo"]; 

FYI, el nombre del operador que' preguntando acerca de no es "el operador ternario", es the conditional operator.

que lo preguntas, de manera que en realidad podría utilizar el operador condicional para hacer lo que estás preguntando es:

$myarray['foo'] == $bar ? $variablename = $myarray['foo'] : null; 

pero eso es algo terriblemente fea y muy imposible de mantener.

+3

Creo que es más seguro usar llaves siempre. –

+7

Solo quería señalar, en realidad se llama operador ternario http://ca.php.net/ternary#language.operators.comparison.ternary – Evert

+0

Pfaugh. Muestra lo que Zend sabe. – chaos

1

Su derecho, ternario no es el camino a seguir. Está ahí para manejar la parte if y else de la declaración.

Simplemente se pega con la instrucción if normal.

if($myarray["foo"]==$bar) $variablename=$myarray["foo"]; 
0

Se puede retener la expresión original en la parte else de la operación ternaria, pero si usted quiere garantizar evaluación simple de la expresión entonces usted tendrá que usar una variable temporal y un estado de if.

7

No puede ser mucho más corto que:

if($condition) $var = $value; 
0

ternario no es el camino, a pesar de que puede escribirse de manera que las obras ternarios.

La razón es esta: estás tratando de usarlo de una manera que no está prevista, lo que hará que tu código sea incómodo para que lo lean otros desarrolladores.

3

usted puede hacer esto, pero yo no, ya que es bastante ilegible y estúpida:

$myarray["foo"] == $bar ? $variablename = $myarray["foo"] : 0; 

o

$myarray["foo"] == $bar && $variablename = $myarray["foo"]; 
2

El "problema" que tienes no es realmente un problema. Su código de ejemplo es muy claro y fácil de mantener. Realmente diría que lo dejéis como está.

Usted - podría - eliminar las llaves, pero eso tendrá un impacto en la capacidad de mantenimiento.

Su otra alternativa es crear una función de contenedor set_if_true (matriz mixta, clave de cadena, condicional booleano). Oculta lo que realmente está sucediendo, pero dependiendo de su implementación específica, es una buena opción. (Por ejemplo, un objeto de tipo de configuración, o backend caching)

+0

De acuerdo. Añadiré que usted (u otros) podría querer consultar un estándar de codificación para cualquier proyecto con el que esté trabajando. Por ejemplo, estados drupal "Utilice siempre llaves, incluso en situaciones donde sean técnicamente opcionales. Tenerlos aumenta la legibilidad y disminuye la probabilidad de que se introduzcan errores lógicos cuando se agregan nuevas líneas". [ref] (https://drupal.org/coding-standards) – cdmo

0

Deja != en lugar de == y ?: en lugar de sólo ?..

$variablename = ($myarray["foo"] != "bar") ?: $myarray["foo"]; 

es el mismo que

if($myarray["foo"] != "bar"){} else { $variablename = $myarray["foo"]; } 

Puede que no sea la la solución más inteligente, pero funciona. Me gusta este más

if($myarray["foo"] != "bar") {$variablename = $myarray["foo"]}; 
Cuestiones relacionadas