Ver Mensaje Individual
  #2 (permalink)  
Antiguo 07/08/2008, 09:52
okram
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Se puede poner 2 grupos de condiciones en un if()

No te compliques demasiado y usa paréntesis para agrupar condiciones. Al evaluar las sentencias, PHP lo hace de izquierda a derecha. Como sabes, existen dos "operadores" si es que deseas incluir varias condiciones, and (&&) y or (||). El primero requiere que todas las condiciones sean calificadas como true, y el segundo, que basta una de ellas, para que toda la expresión sea verdadera.

Ahora, chécate estos ejemplos

Código PHP:
if ( false or true ) {} // Verdadero
if ( false or false ) {} // Falso
if ( true or true ) {} // Verdadero
 
# A
if ( true or false and true ) {} // VERDADERO 
 
# B
if ( false and false or true and true ) {} // VERDADERO
 
# C
if ( false and true or true and false ) ) {} // FALSO 
Haber si se me entendió. Mas o menos es así. Cuando hay varias condiciones, PHP separa las condiciones en base a las estructuras OR, ya que como vimos, basta con que una de ellas se cumpla para que la expresión sea vedadera. Comienza a evaluarlas una por una. Si no ponemos paréntesis, PHP tiene en cuenta el siguiente operador (OR o AND).

Si el siguiente es un OR, quiere decir que la condición terminó y, si fue evaluada como verdadera, todo fue verdadero. Si es un AND, PHP sigue evaluando las siguientes hasta que encuentre otro OR, y luego recién emite una respuesta.

Por eso, en el ejemplo A, la primera condición evaluó como true, y como el operador que sigue es un OR, PHP considera esa primera evaluación como verdadera y toda la expresión en sí sale verdadera.

En el segundo caso (B), tenemos dos condiciones (separemos en base al OR). La primera de ellas (false and false) obviamente devuelve false. La segunda (true and true) devuelve verdadero. La expresión resulta, entonces, verdadera.

En el tercer caso (C), y que es lo mismo que en tu ejemplo, tenemos igual dos condiciones (false and true y true and false, y en este caso ambas devuelven false.



Por lo tanto, está bien así como lo pones, ya que:

Código:
if ( a and b or c and d and e or f or g and h and i and j )
es igual a
Código:
if( 
  ( a and b ) or 
  ( c and d and e ) or 
  ( f ) or 
  ( g and h and i and j ) 
)
Pero es más práctico que las agrupes y así te evitas confusiones con condiciones más complejas.

Saludos,