15 Octubre 2009
Hace poco vimos la condicional if/else y como esta funcionaba a partir de evaluar una operación.
También vimos condicionales anidadas. Por ejemplo, quiero que evalues tal operación. Si es cierta, evalua esta otra instrucción. Si esta también es cierta, ejecuta esta instrucción.
Con los operadores lógicos evitamos tener que crear varias condicionales, haciendo que la función if evalue varias operaciones en una sola instrucción.
Antes de empezar aviso: Por lo general, cuando nos enseñan algo que nos cuesta de aprender, si luego nos muestran otra manera de resolver el problema, tendemos a no prestarle demasiada atención, pues ya hemos realizado un esfuerzo en aprender un método, ¿para qué aprender otra forma? Pues bien, estoy convencido de que este método lo vais a tener que aprender sí o sí, así que intentad dedicarle unos minutos y vereis que es algo muy simple.
En la entrada anterior sobre condicional if/else vimos el siguiente ejemplo:
Para no usar una condicional if dentro de otra condicional if, podemos usaro operadores lógicos.
En el primer if evalua una operación, si es cierta, continua dentro de las llaves, donde se encuentra otra condicional if. La evalua, si es cierta, muestra el resultado deseado.
En este caso, el resultado deseado se mostrará cuando ambas condicionales sean ciertas. Por tanto, podemos utilizar el operador lógico AND (&). PHP acepta tanto la palabra reservada and, como un & o dos &&.
Probad a crear la variable $mi_variable antes de la condicional if y asignarle distintos valores, por ejemplo, asignarle un número, letra o letras, luego dejarla en blanco ($mi_variable = ''; //No son comillas dobles, son dos comillas simples) o no crearla.
En este caso, al usar el operador lógico, con una única condicional if y con menos lineas de código, llegamos al mismo resultado, o casi, pues en caso de no cumplirse las dos condiciones, nos dice que alguna de las dos no la cumple, pero no nos dice cual de las dos no la cumple. Si necesitamos saber cual ha sido, el ejemplo de la entrada anterior es más acertado.
Nota: en este caso concreto, donde comprobamos si la variable existe (isset) y no está vacía (!empty) se puede cambiar por if($mi_variable). Si no ponemos ninguna operación y solo indicamos una variable, lo que se evalua es si existe y no está vacía.
Ahora veremos otro ejemplo donde vemos más claro la de lineas de código que ahorramos utilizando los operadores lógicos, pero primero, vamos a ver otra opción más de if.
Hasta ahora hemos visto que podemos usar if sin más o añadirle la opción else. Falta otra.
Supongamos que queremos que evalue una operación y si no se cumple, que evalue otra. Con lo aprendido hasta ahora, el código sería así:
Como veis (o eso espero), en caso de que no se cumpla la primera condición, abre un else y dentro de este abre la segunda condición para que se ejecuten las mil lineas de código. En este caso, si se cumple alguna de las dos condicionales, las mil lineas de código se ejecutarían, pero hemos abierto las llaves del else y luego, dentro, las llaves del segundo if.
La forma correcta de hacer esto sería la siguiente:
Así se ve todo más claro y ahorramos llaves y condicionales anidadas.
If evalua una operación. Si es cierta, se ejecuta el código tras las llaves, si no lo es continua con el programa. Si tras el if hay un else y la operación del if no es cierta, automáticamente se ejecuta el código entre las llaves del else, pero si en vez de else ponemos elseif, antes de ejecutar el código avaluará la nueva operación.
Podemos tener los siguientes casos.
1:
programa principal
if(){
}
programa principal
2:
programa principal
if(){
}
else{
}
programa principal
3:
programa principal
if(){
}
elseif(){
}
programa principal
4:
programa principal
if(){
}
else if(){
}
elseif(){
}
elseif(){
}
...
programa principal
5:
programa principal
if(){
}
elseif(){
}
...
else{
}
programa principal
En el último caso, que es el más completo, evalua la primera operación. Si es cierta, ejectua el código entre sus llaves y cuando termina sigue por el programa principal. Si no es cierta, pasa a la segunda y así hasta que encuentra una operación que sea cierta. Cuando encuentra una operación que es cierta, ejecuta el código entre sus llaves y luego continua por el programa principal. Las demás operaciones ya no las mira. En caso de que no se cumpla ninguna operación, ejecuta el código entre las llaves del else y luego sigue por el programa principal. Si no hay else pues directamente iría al programa principal.
Una vez todo esto está claro, vamos a ver dos formas de resolver el siguiente caso, y a ver cual es la más óptima.
- Tenemos dos variables ($a y $b) y tenemos un código de mil lineas que queremos que se ejecute siempre que alguna de las dos variables sea igual a 1, es decir, no importa cual, siempre que a o b tengan el valor uno, el código de las mil lineas se ejecutará. Si las dos valen uno, se ejecutará. En caso de que ninguna valga uno, no se ejecuta. Este operador lógico se conoce como OR, y cumple eso, que dados un número n de variables, si cualquiera de ellas tiene el valor uno, el resultado final es uno. Si más de una tienen el valor uno el resultado final es uno. Si nunguna vale uno, el resultado final es cero. También se conoce como suma lógica.
Su tabla de verdad sería la siguiente:
| A | B | Salida |
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 1 |
Pues bién, en una posible solución sería la siguiente:
Otra posible solución:
Ambos ejemplos hacen exactamente lo mismo. La diferencia es que en el segundo caso hemos usado el operador lógico OR, representado por dos barras verticales (||) o escribiendo directamente or, con lo que escribimos las mil lineas de código una sola vez. En el primer ejemplo, las mil líneas de código están por duplicado, ocupando más espacio.
Ya hemos visto dos operadores: and y or.
El primero, and, se cumple siempre que todas las operaciones evaluadas sean ciertas.
El segundo, or, se cumple cuando alguna de las operaciones es cierta. Si todas las operaciones son ciertas, también se cumple.
Hay un tercero, xor, que se cumple cuando solo una de las operaciones evaluadas son ciertas. Si ninguna es cierta, no se cumple. Si más de una es cierta, tampoco.
Su tabla lógica de verdad es la siguiente:
| A | B | Salida |
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
Su uso sería if($a == 1 xor $b == 1){ };
El código entre llaves se ejecuta cuando solo una de las variables es igual a 1.
La complicación viene cuando usamos más de dos variables.
¿Qué creeis que dirá, sí o no? La lógica nos dice, o al menos debería, que la respuesta debería ser NO, pues hay más de una operación cierta, y la or exclusiva (xor) solo se cumple cuando hay solo una operación cierta.
Sin embargo, el mensaje mostrado será sí, pues la condicional if no evalua todas las operaciones al mismo tiempo.
En ese caso, lo que haría es evaluar $a ==1 xor $b==1. Como ambos son ciertos, el resultado es falso. Luego compara ese falso con $c. Como $c es igual a cero (es falso) y lo está comparadando con el resultado anterior, que era cero (falso), 0 xor 0 es igual a 0. Ahora compara este resultado con $d. $d es verdadero (es igual a 1) por tanto 0 xor 1 es igual a uno, así que el resultado final es 1 o cierto. En lógica, el cero se asocia con falso y el uno con verdadero. Son datos booleanos. Es lo mismo decir uno que verdadero o cierto, y es lo mismo decir cero que falso.
Por tanto, el funcionamiento es evaluar las dos primeras operaciones, comparar su resultado con la tercera y comparar este resultado con la última. Usando paréntesis, quedaría así:
((($a xor $b) xor $c) xor $d)
Recordatorio: los operadores para evaluar operaciones son igual (==), distinto (!=), menor que (<), mayor que (>), menor o igual que (<=) mayor o igual que (>=).
Para el igual, se usan dos signos de igual, no uno, pues si pones solo uno siempre se evalua como cierto.
ACTUALIZO: Me han recordado que el operador xor solo admite dos variables, es decir, no puede haber una operación xor con tres o más variables. En nuestro ejemplo, aunque vemos cuatro variables, no hay ningún error debido a que php los evalúa, como ya he dicho antes, como si hubiera paréntesis, es decir, de dos en dos variables.
Muy buena la ayuda, me gusta la maner...
Espero que no les parezca dificil, pu...
nose
He intentado usar wordpress para el b...