Operadores y Estructuras de Control

Los operadores son elementos que relacionan de forma diferente, los valores de una o más variables y/o constantes. Es decir, los operadores nos permiten manipular valores.

Las estructuras de control en los lenguajes de programación, permiten modificar el flujo de ejecución de las instrucciones de un programa.

27-Nov-2016

Operadores en PHP

En PHP como en otros lenguajes disponemos de una serie de operadores comunes:

  • Aritméticos
  • Asignación
  • Comparación
  • Lógicos

Así como una serie de operadores especiales para:

  • Incrementos y Decrementos
  • Trabajar con Cadenas
  • Trabaja a nivel de Bits
  • Trabajar con Arrays (los veremos el módulo dedicado al trabajo con arrays)

Operadores aritméticos

Los operadores aritméticos permiten la realización de operaciones matemáticas con los valores (variables y constantes). Pueden ser utilizados con tipos de datos enteros (integer) o de coma flotante (float). Si ambos son enteros, el resultado es entero; si alguno de ellos es float, el resultado será float.

Operadores aritméticos
Ejemplo Nombre Resultado
-$a Negación Opuesto de $a.
$a + $b Adición Suma de $a y $b.
$a - $b Sustracción Diferencia de $a y $b.
$a * $b Multiplicación Producto de $a y $b.
$a / $b División Cociente de $a y $b.
$a % $b Módulo Resto de $a dividido por $b
$a ** $b Exponenciación Resultado de elevar $a a la potencia $b
<?php
$a = -100;
$b = 30;
$c = 25.12345;
echo 'VARIABLES:<br/>',
     '$a = ',$a,'<br/>',
     '$b = ',$b,'<br/>',
     '$c = ',$c,'<br/>',
     '<br/>RESULTADOS:<br/>',
     'Negación -$a -> ',-$a,' (',gettype(-$a),')<br/>',
     'Adición $a + $b -> ',($a+$b),' (',gettype($a+$b),')<br/>',
     'Adición -$a + $c -> ',(-$a+$c),' (',gettype(-$a+$c),')<br/>',
     'Sustracción $a - $b -> ',($a-$b),' (',gettype($a-$b),')<br/>',
     'Multiplicación $a * $b -> ',($a*$b),' (',gettype($a*$b),')<br/>',
     'División $a / $b -> ',($a/$b),' (',gettype($a/$b),')<br/>',
     'Módulo $a % $b -> ',($a%$b),' (',gettype($a%$b),')<br/>', 
     'Exponenciación $b ** 3 -> ',($b**3),' (',gettype($b**3),')<br/>'; 
?> 
// Resultado
VARIABLES:
$a = -100
$b = 30
$c = 25.12345

RESULTADOS:
Negación -$a -> 100 (integer)
Adición $a + $b -> -70 (integer)
Adición -$a + $c -> 125.12345 (double)
Sustracción $a - $b -> -130 (integer)
Multiplicación $a * $b -> -3000 (integer)
División $a / $b -> -3.3333333333333 (double)
Módulo $a % $b -> -10 (integer)
Exponenciación $b ** 3 -> 27000  (integer)

Operadores de asignación

El operador básico de asignación es "=".

El valor de una expresión de asignación es el valor asignado. Es decir, el valor de "$a = 5" es de 5. Esto permite hacer algunas cosas intrincadas:

<?php

  // Ahora  $a es igual a 10 y $b se ha establecido en 5.
  $a = ($b = 5) + 5;
  
?>

Además del operador básico de asignación, existen "operadores combinados" para todos los de aritmética binaria, unión de arrays y operadores de strings que permiten usar un valor en una expresión y entonces establecer su valor como el resultado de esa expresión.

Por ejemplo:

<?php

  $a = 3;
  // Asigna  el valor 8 a la variable $a, como si se hubiéramos hecho: $a = $a + 5;
  $a += 5;
  $b = 'Hola ';
  // Establece  $b en 'Hola ahí!', utilizando el operador de concatenación de strings al igual que  $b=$b.'ahí!';
  $b .= 'ahí!';
  
?>

En PHP siempre que se realiza una asignación esta se realiza por valor, es decir el resultado es una copia del valor original, por lo que los cambios en una no afectarán a la otra.

Una excepción al comportamiento usual de la asignación por valor en PHP ocurre con objetos los cuales son asignados por referencia en PHP 5, como suele ocurrir en la POO del resto de lenguajes que dan soporte a este tipo de programación.

Asignación por referencia

La asignación por referencia también está soportada, utilizando la sintaxis "$var = &$otravar;". Asignación por referencia significa que ambas variables terminan apuntando a los mismos datos y nada es copiado en ninguna parte.

$var = $var1;
Asignación por valor $var y $var1 serán distintas con el mismo valor: Si $var cambia $var1 no se verá afectada

$var = &$var1;
Asignación por referencia $var y $var1 serán idénticas apuntando al mismo valor: Si $var cambia $var1 también cambiará y viceversa
<?php
 $a = 10;
 $b = 15;
 
echo '<h2>OPERADORES DE ASIGNACIÓN</h2>',
    "<p>El valor de \$a es $a el valor de \$b  es $b</p>";
    $suma = $a+$b;
    
echo "<p>La suma de las variables da como resultado $suma</p>";

// Asignación por referencia $c y $b son idénticas
$c = &$b;
// Cambiamos el tipo y contenido de la variable  $b
$b = 'hola';

echo "<p>El contenido de las variables \$b y \$c es '$b' y '$c' después  de realizar una asignación por referencia \$c=&\$b.</p>";
?>
// RESULTADO
OPERADORES DE ASIGNACIÓN

El valor de $a es 10 el valor de $b es 15

La suma de las variables da como resultado 25

El contenido de las variables $b y $c es 'hola'  y 'hola' después de realizar una asignación por referencia $c=&$b.

Operadores de comparación o relacionales

Se utilizan para establecer una relación entre dos valores. PHP compara estos valores entre si y esta comparación produce un resultado lógico (true o false).

Los operadores relacionales comparan valores del mismo tipo (numéricos o cadenas), entre ellos tienen el mismo nivel de prioridad en su evaluación, pero tienen menor prioridad que los aritméticos.

Operadores de comparación
Ejemplo Nombre Resultado
$a == $b Igual TRUE si $a es igual a $b después de la manipulación de tipos.
$a === $b Idéntico TRUE si $a es igual a $b, y son del mismo tipo.
$a != $b Diferente TRUE si $a no es igual a $b después de la manipulación de tipos.
$a <> $b Diferente TRUE si $a no es igual a $b después de la manipulación de tipos.
$a !== $b No idéntico TRUE si $a no es igual a $b, o si no son del mismo tipo.
$a < $b Menor que TRUE si $a es estrictamente menor que $b.
$a > $b Mayor que TRUE si $a es estrictamente mayor que $b.
$a <= $b Menor o igual que TRUE si $a es menor o igual que $b.
$a >= $b Mayor o igual que TRUE si $a es mayor o igual que $b.

Otro operador condicional es el operador "?:" (o ternario), que funciona como en C y otros muchos lenguajes.

  (expr1)? (expr2):(expr3);

La expresión toma el valor expr2 si expr1 se evalúa a cierto, y expr3 si expr1 se evalúa a falso.

Equivale a una sentencia condicional simple if else expresada en una sola línea.

<?php
  // Teniendo las siguientes variables definidas:
  $a = 10; 
  $b = '10'; 
  $c = 5; 
  $d = 'Hola Pepe'; 
  $e = 'Hola Luis';
  $f = 'hola';
  
  // Comprobamos las expresiones:
  $a==$b;       // True son iguales
  $a===$b;      // False son iguales pero  de distinto tipo
  $a!==$b;      // True $a es de distinto  tipo que $b
  $b>$c;        // True $b es mayor que $c
  $a!=$c;       // True $a es distinto de  $c
  $a<>$c;       // True igual que la anterior
  $d==$e;       // False no son cadenas idénticas
  $d[0]==$e[0]; // True su  primer carácter es idéntico
  $d[0]==$f;    // False su primer carácter  es distinto (hay distinción de mayúsculas y minúsculas)
  
  $Resultado=($a>$c)?  'Es Mayor':'Es Menor'; 
  // Dara como resultado Es Mayor porque $a es  mayor que $b
  echo $Resultado;
?>
 

Comparación de floats

Comprobar la igualdad de valores de punto flotante es problemático, debido a la forma en que se representan internamente. Sin embargo, hay maneras de hacer comparaciones de los valores de punto flotante que trabajan rodeando a estas limitaciones.

Para comprobar la igualdad de valores de punto flotante, se utiliza un límite superior en el error relativo debido al redondeo. Este valor se conoce como el epsilon de la máquina o unidad de redondeo y es la menor diferencia aceptable en los cálculos.

<?php
  $a = 1.23456789;
  $b = 1.23456780;
  $epsilon = 0.00001;
  // $a y $b son iguales a una precisión de 5  dígitos
  if(abs($a-$b) < $epsilon) echo '$a y $b son iguales<br />';
?>

Operadores de incremento/decremento

PHP soporta los operadores de pre- y post- decremento e incremento al estilo de otros lenguajes como C.

Los Operadores de incremento y decremento son operadores unarios que agregan o sustraen uno de sus operandos, respectivamente. El operador de incremento aumenta el valor de su operando en 1. El operando debe ser un tipo de dato numérico. Similarmente, el operador de decremento disminuye el valor de su operando en 1.

Operadores de incremento / decremento
Ejemplo Nombre Efecto
++$a Pre-incremento Incrementa $a en uno, y luego retorna $a.
$a++ Post-incremento Retorna $a, y luego incrementa $a en uno.
--$a Pre-decremento Decrementa $a en uno, luego retorna $a.
$a-- Post-decremento Retorna $a, luego decrementa $a en uno.
<?php
    $a = 5;
    echo '<h2>OPERADORES DE  INCREMENTO Y DECREMENTO</h2>',
    "<p>El valor de \$a es  $a</p>";
    
    echo '<h3>Postincremento</h3>', 
         'antes $a &rarr; ',$a,'<br />',
         'post-incremento $a++ &rarr; ',$a++,'<br />',
         'después $a &rarr; ',$a,'<br />';
    echo '<h3>Preincremento</h3>',
         'antes $a &rarr; ',$a,'<br />',
         'pre-incremento ++$a &rarr; ',++$a,'<br />',
         'después $a &rarr; ',$a,'<br />';
    echo '<h3>Postdecremento</h3>',
         'antes $a &rarr; ',$a,'<br />',
         'post-decremento $a-- &rarr; ',$a--,'<br />',
         'después $a &rarr; ',$a,'<br />';
    echo '<h3>Predecremento</h3>',
         'antes $a &rarr; ',$a,'<br />',
         'pre-decremento --$a &rarr; ',--$a,'<br />',
         'después $a &rarr; ',$a,'<br />';
?>
// RESULTADO
OPERADORES DE INCREMENTO Y DECREMENTO

El valor de $a es 5

Postincremento

antes $a → 5
post-incremento $a++ → 5
después $a → 6

Preincremento

antes $a → 6
pre-incremento ++$a → 7
después $a → 7

Postdecremento

antes $a → 7
post-decremento $a-- → 7
después $a → 6

Predecremento

antes $a → 6
pre-decremento --$a → 5
después $a → 5

Operadores lógicos

También llamados operadores booleanos, se utilizan para crear condiciones compuestas en una fórmula. Al igual que los operadores condicionales devuelven un valor lógico de verdadero o falso y determinar si la expresión completa se cumple en función de las tablas de verdad.

Operadores lógicos
Ejemplo Nombre Resultado
$a and $b And (y) TRUE si tanto $a como $b son TRUE.
$a or $b Or (o inclusivo) TRUE si cualquiera de $a o $b es TRUE.
$a xor $b Xor (o exclusivo) TRUE si $a o $b es TRUE, pero no ambos.
! $a Not (no) TRUE si $a no es TRUE.
$a && $b And (y) TRUE si tanto $a como $b son TRUE. Se evalúa antes que el operador and
$a || $b Or (o inclusivo) TRUE si cualquiera de $a o $b es TRUE. Se evalúa antes que el operador or

Las tablas de verdad de los operadores And, Or, Not y Xor se muestran en las tablas siguientes:

Operador And
$a $b Resultado
TRUE TRUE TRUE
TRUE FALSE FALSE
FALSE TRUE FALSE
FALSE FALSE FALSE
Operador Or
$a $b Resultado
TRUE TRUE TRUE
TRUE FALSE TRUE
FALSE TRUE TRUE
FALSE FALSE FALSE

 

Operador Not
$a Resultado
TRUE FALSE
TRUE TRUE
Operador Xor
$a $b Resultado
TRUE TRUE FALSE
TRUE FALSE TRUE
FALSE TRUE TRUE
FALSE FALSE FALSE
<?php
  $a = true;
  $b = false;
  $c = true;
  $d = 5;
  $e = 10;
        
  echo '<h2>OPERADORES LÓGICOS</h2>',
       '<p>El valor de $a es: ',(($a)? 'true':'false'),'<br  />',
       'El valor de $b es: ',(($b)? 'true':'false'),'<br  />',
       'El valor de $c es: ',(($c)? 'true':'false'),'<br  />',
       "El valor de \$d es: $d<br />",
       "El valor de \$e es: $e</p>";
       
  echo '<pre>',
       '$a and $b  &rarr; ',(($a and $b)? 'true':'false'),'<br  />',
       '$a and $c  &rarr; ',(($a and $c)? 'true':'false'),'<br  />',
       '($d > $e) and ($c==$a)  &rarr; ',((($d > $e) and ($c==$a))? 'true':'false'),'<br/>',
       '$a or $b   &rarr; ',(($a or $b)? 'true':'false'),'<br  />',
       '$a or $c   &rarr; ',(($a or $c)? 'true':'false'),'<br  />',
       '($d > $e) or ($c==$a)  &rarr; ',((($d > $e) or ($c==$a))? 'true':'false'),'<br/>',
       '$a xor $b  &rarr; ',(($a xor $b)? 'true':'false'),'<br  />',
       '$a xor $c  &rarr; ',(($a xor $c)? 'true':'false'),'<br  />',
       'Not $a     &rarr; ',((!  $a)? 'true':'false'),'<br  />',
       'Not $b     &rarr; ',((!  $b)? 'true':'false'),'<br  />',
       '$a && $b   &rarr; ',(($a && $b)? 'true':'false'),'<br  />',
       '$a && $c   &rarr; ',(($a && $c)? 'true':'false'),'<br  />',
       '$a || $b   &rarr; ',(($a || $b)? 'true':'false'),'<br  />',
       '$a || $c   &rarr; ',(($a || $c)? 'true':'false'),'</pre>';
?>
// RESULTADO
OPERADORES LÓGICOS

El valor de $a es: true
El valor de $b es: false
El valor de $c es: true
El valor de $d es: 5
El valor de $e es: 10

$a and $b   → false
$a and $c   → true
($d > $e) and ($c==$a)  → false
$a or $b    → true
$a or $c    → true
($d > $e) or ($c==$a)  → true
$a xor $b   → true
$a xor $c   → false
Not $a      → false
Not $b      → true
$a && $b    → false
$a && $c    → true
$a || $b    → true
$a || $c    → true

Operadores de cadena

En PHP nos encontramos sólo dos operadores para el trabajo con cadenas (string). El primero es el operador de concatenación ('.'), el cual retorna el resultado de concatenar sus argumentos derecho e izquierdo. El segundo es el operador de asignación sobre concatenación ('.='), el cual añade el argumento del lado derecho al argumento en el lado izquierdo. 

<?php
    $a = 'Mi casa';
    $b = ' es grande';
    $c = ' es pequeña';
    
    echo '<h2>OPERADORES PARA STRINGS</h2>',
         "<p>El valor de \$a es:  '$a'<br />",
         "El valor de \$b es: '$b'<br  />",
         "El valor de \$c es:  '$c'</p>";
    
    $d=$a.$c;
    $a.=$b;
    
   echo "Hemos declarado la variable \$d como \$a.\$c y su valor es:  '$d'<br/>",
        "Hemos redefinido la variable \$a como .=\$b  y su valor es: '$a'<br/>";
?>
// RESULTADO
OPERADORES PARA STRINGS

El valor de $a es: 'Mi casa'
El valor de $b es: ' es grande'
El valor de $c es: ' es pequeña'

Hemos declarado la variable $d como $a.$c y  su valor es: 'Mi casa es pequeña'
Hemos redefinido la variable $a como .=$b y  su valor es: 'Mi casa es grande'

Operadores bit a bit

Los operadores bit a bit como su nombre indica, trabajan a nivel de bits y permiten la evaluación y la manipulación de bits específicos dentro de un integer.

Operadores bit a bit
Ejemplo Nombre Resultado
$a & $b And (y) Los bits que están activos en ambos $a y $b son activados.
$a | $b Or (o inclusivo) Los bits que están activos ya sea en $a o en $b son activados.
$a ^ $b Xor (o exclusivo) Los bits que están activos en $a o en $b, pero no en ambos, son activados.
~ $a Not (no) Los bits que están activos en $a son desactivados, y viceversa.
$a << $b Shift left
(desplazamiento a izquierda)
Desplaza los bits de $a$b pasos a la izquierda (cada paso quiere decir "multiplicar por dos").
$a >> $b Shift right
(desplazamiento a derecha)
Desplaza los bits de $a$b pasos a la derecha (cada paso quiere decir "dividir por dos").
<?php
    $a = 5;
    $b = 2;
    
    echo '<h2>OPERADORES BIT A BIT</h2>',
         "<p>El valor de \$a es $a (".sprintf("%08d",decbin($a)).")<br/>",
         "El valor de \$b es $b (".sprintf("%08d",decbin($b)).")</p>";
    
    echo '<pre>',
         '$a & $b (And) ',$a  & $b,'(',sprintf("%08d",decbin($a & $b)),')<br />',
         '$a | $b (Or)  ',$a | $b,'(',sprintf("%08d",decbin($a | $b)),')<br />',
         '~ $a    (Not) ',~ $a,'(',sprintf("%08d",decbin(~ $a)),')<br />',
         '$a << $b (Desplazamiento a izquierda) ',$a << $b,'(',sprintf("%08d",decbin($a << $b)),')<br />',
         '$a >> $b (Desplazamiento a derecha)   ',$a >> $b,'(',sprintf("%08d",decbin($a >> $b)),')</pre>';
?>
// RESULTADO
OPERADORES BIT A BIT

El valor de $a es 5 (00000101
El valor de $b es 2 (00000010)

$a & $b (And) 0(00000000)
$a | $b (Or)  7(00000111)
~ $a     (Not) -6(2147483647)
$a << $b (Desplazamiento a izquierda)  20(00010100)
$a >> $b (Desplazamiento a  derecha)   1(00000001)

En el script anterior he utilizado dos funciones sprintf (String Print Format) y decbin (Decimal to Binari) para ilustrar mejor como trabajan los operadores a nivel de bits.

//Devuelve una cadena que es la representación binaria de  un número, pero sin rellenar con ceros a la izquierda.
  decbin(Número)
// Imprimir cadenas preformateadas con opciones especiales, en nuestro caso se utiliza el código especial %08d 
// para que imprima un número entero con relleno  de ceros a la izquierda hasta completar 8 posiciones.
  sprintf(Formato,Argumento1,Argumento2,....)

Estructuras de control en PHP

En PHP disponemos de estructuras condicionales e iterativas para el control del flujo del programa:

  • Condicionales
    • Simples: if
    • Dobles: if else
    • Múltiples if elseif else, switch
  • Iterativas
    • Mientras: while, do .. while
    • Para: for, foreach (lo veremos el módulo dedicado al trabajo con arrays)

Condicional If

La construcción if es una de las más importantes características de muchos lenguajes, incluido PHP. Permite la ejecución condicional de fragmentos de código. PHP caracteriza una estructura if que es similar a la de C:

Simples: if



if(Expresión) 
   Sentencia;
        
        
        
if(Expresión) { 
   Sentencia;
   Sentencia;
   …
}

Sintaxis de corchetes {}
if(Expresión):
   Sentencia;
   Sentencia;
   …
endif;

Sintaxis alternativa de dos puntos : 

Expresión se evaluará a su valor booleano, si se evalúa a TRUE se ejecutará el bloque de sentencias.

Si queremos indicar más de una sentencia, tendremos que encerrarlas entre signos de {} o utilizar la sintaxis alternativa donde el corchete de apertura ({) se sustituye por dos puntos (:) y el corchete de cierre (}) por (endif;). Esta sintaxis alternativa es admitida también por otras estructuras condicionales e iterativas.

<?php

   $a = 10;
   $b = 30;
   
   echo '<H2>CONDICIONAL SIMPLE</H2>',
        '<p><strong>VARIABLES:</strong><br/>',
        '$a = ',$a,'<br/>',
        '$b = ',$b,'</p>',
        '<p><strong>RESULTADO</strong><br/>';
    
// Se evaluarán las tres condicionales por  separado
   if($a > $b) echo '$a es mayor que $b</p>';
   
   if($b > $a) echo '$b es mayor que $a</p>';

   if($b === $a) echo '$a y $b son iguales</p>';
   
?>
// RESULTADO
CONDICIONAL SIMPLE

VARIABLES:
$a = 10
$b = 30

RESULTADO
$b es mayor que $a

Dobles: if else

La sentencia else, extiende una sentencia if para ejecutar una sentencia diferente en caso que la expresión if original se evalúe como FALSE.

Ejecutará el bloque de sentencias del if si expresión es evaluada a TRUE y extenderá la ejecución de sentencias al else si la expresión se evalúa a FALSE.

   
   
   
if(Expresión) 
   Sentencia;
else
   Sentencia;
   
   
   
   
if(Expresión) { 
   Sentencia;
   Sentencia;
   …
} else {
   Sentencia;
   Sentencia;
   …
}   

Sintaxis de corchetes {}
if(Expresión):
   Sentencia;
   Sentencia;
   …
else:
   Sentencia;
   Sentencia;
   …
endif;

Sintaxis alternativa de dos puntos : 

La sintaxis alternativa también se aplica a else utilizando los dos puntos (:).

<?php
  $a = 100;
  $b = 100;
  
  echo '<H2>CONDICIONAL DOBLE</H2>',
       '<p><strong>VARIABLES:</strong><br/>',
       '$a = ',$a,'<br/>',
       '$b = ',$b,'</p>',
       '<p><strong>RESULTADO</strong><br/>';
    
//  Se evalúa la condicional doble y la  condicional simple por separado
  if($a > $b): 
     echo '$a es mayor que $b<br />';
     echo 'La diferencia de $a - $b es: '.($a - $b).'</p>';
  else:
     echo '$b es mayor o igual que $a<br />';
     echo 'La diferencia de $b - $a es: '.($b - $a).'</p>';
  endif;
    
  if($b === $a)
     echo '$a y $b son iguales';
?>
// RESULTADO
CONDICIONAL DOBLE

VARIABLES:
$a = 100
$b = 100

RESULTADO
$b es mayor o igual que $a
La diferencia de $b - $a es: 0

$a y $b son iguales

Múltiples: if elseif else

La sentencia elseif es una combinación de if y else. Pueden haber varios elseif dentro de la misma sentencia if. La sentencia elseif es ejecutada solamente si la expresión if precedente y cualquiera de las expresiones elseif precedentes son evaluadas como FALSE, y la expresión elseif actual se evalúa como TRUE.





if(Expresión) 
   Sentencia;
elseif(Expresión)
   Sentencia;
else
   Sentencia;
   
   
   
   
   
if(Expresión) { 
   Sentencia;
   Sentencia;
   …
} elseif(Expresión) {
   Sentencia;
   Sentencia;
   …
} else {  
   Sentencia;
   Sentencia;
   …
}

Sintaxis de corchetes {}
if(Expresión):
   Sentencia;
   Sentencia;
   …
elseif(Expresión):
   Sentencia;
   Sentencia;
   …
else:
   Sentencia;
   Sentencia;
   …
endif;

Sintaxis alternativa de dos puntos : 

La sintaxis alternativa también se aplica a elseif utilizando los dos puntos (:).

<?php
  $a = 100;
  $b = 100;
  
  echo '<H2>CONDICIONAL MÚLTIPLE</H2>',
       '<p><strong>VARIABLES:</strong><br/>',
       '$a = ',$a,'<br/>',
       '$b = ',$b,'</p>',
       '<p><strong>RESULTADO</strong><br/>';
    
//  Se evalúa la condicional múltiple
  if($a > $b):
     echo '$a es mayor que $b<br />';
     echo 'La diferencia de $a - $b es: '.($a - $b).'</p>';
  elseif($b > $a):
     echo '$b es mayor que $a<br />';
     echo 'La diferencia de $b - $a es: '.($b - $a).'</p>';
  else:
     echo '$a y $b son iguales</p>';
  endif;

?>
// RESULTADO
CONDICIONAL DOBLE

VARIABLES:
$a = 100
$b = 100

RESULTADO
$a y $b son iguales

Condicional múltiple switch

La sentencia switch es similar a una serie de sentencias IF en la misma expresión. En muchas ocasiones, se quiere comparar la misma variable (o expresión) con muchos valores diferentes, y ejecutar una parte de código distinta dependiendo de a qué valor es igual.

    

  if(Expresión) {
     Sentencia;
     Sentencia;
     …
  } elseif(Expresión) {
     Sentencia;
     Sentencia;
     …
  } else {
    Sentencia;
    Sentencia;
    …
  }
  
  switch(Expresión) {
     case valor1:
        Sentencia;
        Sentencia;
        …
     break;  Finaliza la ejecución de las sentencias del bloque case
     case valor2:
        Sentencia;
        Sentencia;
        …
     break;
     default:
        Sentencia;
        Sentencia;
        …
  }
<?php
  $forma_pago=2;
  switch($forma_pago) {
    case 0: $pago='Contado';
    break;
    case 1: $pago='Transferencia bancaria';
    break;
    case 2: $pago='Contra reembolso';
    break;
    default: $pago='No definida';
  }
  echo '<H2>CONDICIONAL MÚLTIPLE  switch</H2>',
       '<p><strong>VARIABLES:</strong><br />',
       '$forma_pago = ',$forma_pago,'</p>',
       '<p><strong>RESULTADO</strong><br />';
  echo "La forma de pago seleccionada es: $pago</p>";
?>
// RESULTADO
CONDICIONAL MÚLTIPLE switch

VARIABLES:
$forma_pago = 2

RESULTADO
La forma de pago seleccionada es: Contra reembolso

La sentencia switch ejecuta línea por línea (realmente, sentencia a sentencia). Al comienzo, no se ejecuta código. Sólo cuando se encuentra una sentencia case con un valor que coincide con el valor de la expresión switch PHP comienza a ejecutar las sentencias. PHP continúa ejecutando las sentencias hasta el final del bloque switch, o la primera vez que vea una sentencia break. Si no se escribe una sentencia break al final de una lista de sentencias case, PHP seguirá ejecutando las sentencias del siguiente case.

  switch(Expresión) {
    case valor1:
       Sentencia;
    case valor2:
       Sentencia;
    default:
       Sentencia;
  }

Si valor1 ya cumple con el  valor de Expresión, ejecutará también las sentencias de valor2 y default al no  
encontrarse ningún break, aunque sus sentencias case no cumplan la condición de Expresión.
<?php
  
  $tamanyo=2;
  $unidad='M'; // Megabytes
  $bytes=$tamanyo;
  
  echo '<H2>CONDICIONAL MÚLTIPLE switch (sin rupturas)</H2>',
       '<p><strong>VARIABLES:</strong><br/>',
       '$tamanyo = ',$tamanyo,'<br />',
       '$unidad = ',$unidad,'<br />',
       '$bytes = ',$bytes,'</p>',
       '<p><strong>RESULTADO</strong><br/>';
    
// Pasar Gb, Mb o Kb a bytes
  switch($unidad) {
    case 'G':    $bytes*=1024;
    case 'M':    $bytes*=1024;
    case 'K':    $bytes*=1024;
  }
  echo "$tamanyo $unidad son ".number_format($bytes,0,',','.')." Bytes</p>";
?>
// RESULTADO
CONDICIONAL MÚLTIPLE switch (sin  rupturas)

VARIABLES:
$tamanyo = 2
$unidad = M
$bytes = 2

RESULTADO
2 M son 2.097.152 Bytes

En el script anterior he utilizado la función number_format de PHP para mostrar los bytes en formato de millares con punto para los miles, coma para los decimales y con 0 decimales.

// Devuelve un string con la representación  de un número con los millares agrupados.
  number_format(Numero,Decimales,SeparadorDecimal,SeparadorMiles)

La lista de sentencias de un case puede también estar vacía, lo cual simplemente pasa el control a la lista de sentencias del siguiente case.

  switch(Expresión) {
    case valor1: 
    case valor2: 
    case valor3: 
       Sentencia;
       Sentencia;
    break; 
    case valor4: 
       Sentencia;
       Sentencia;
    break; 
    default: 
       Sentencia;
  }
  
El primer bloque de  sentencias se ejecutarán con que se cumplan alguna de las tres primeras  
sentencias case (valor1 o valor2 o valor3).

Iterativas mientras: Bucle while

Como en la mayoría de los lenguajes de programación la estructura iterativa que se ejecuta mientras se cumpla la expresión de condición es el bucle while, es decir que la expresión se evalúe a TRUE.

  while(Expresión) {
     Sentencia;
     Sentencia;
     [break;]  Provoca la ruptura incondicional del bucle
     Sentencia;
  }
<?php
  
  $Contador=0;
  echo '<p>';
  while($Contador<=6) {
    echo "Contador con valor: $Contador</br>";
    $Contador++;
  }
  echo '</p>';
  
?>
// RESULTADO
Contador con valor: 0
Contador con valor: 1
Contador con valor: 2
Contador con valor: 3
Contador con valor: 4
Contador con valor: 5
Contador con valor: 6

Iterativas mientras: Bucle do .. while

Similar al bucle while, tenemos el bucle do..while donde la única diferencia es que la expresión de repetición se evalúa al final, por lo que como mínimo su bucle de instrucciones se ejecutarán una vez.

  do {
     Sentencia;
     Sentencia;
     [break;]
     Sentencia;
  } while(Expresión);

En cualquier parte del bloque de sentencias, podemos incluir la sentencia break para obligar a que finalice el bucle y que la ejecución continúe con la siguiente instrucción del código. Esta sentencia resulta útil cuando deseamos crear una ruptura en la ejecución a expensas de la Expresión que condiciona las iteraciones del bucle.

<?php
  
  $Contador=0;
  echo '<p>';
  do {
    echo "Contador con  valor: $Contador</br>";
  } while(++$Contador<=6);
  echo '</p>';

?>
// RESULTADO
Obtenemos el mismo resultado que en el caso  del ejemplo anterior del bucle while

Iterativas para: Bucle for

Como ocurre con el resto de lenguajes el bucle idóneo cuando conocemos el nº de iteraciones que se tienen que realizar es el bucle for. El bucle for es el más complejo en PHP y se comporta como su homólogo en c.

  for(Inicialización; Condición; Incremento) {
     Sentencia;
     Sentencia;
     [break;]
     .....;
  }
  • La Inicialización se ejecuta incondicionalmente una vez al principio del bucle.
  • Al comienzo de cada iteración, se evalúa Condición. Si se resuelve como TRUE, el bucle continúa y las sentencias anidadas se ejecutan. Si se evalúa como FALSE, la ejecución del bucle finaliza.
  • Al final de cada iteración, se ejecuta el Incremento.

Cada una de las expresiones puede estar vacía, pero no todas. Si Condición está vacía el bucle debería iterar indefinidamente es decir, generaría un bucle infinito que podría dejar el script o la página bloqueada.

Cuando utilizamos esta modalidad de sintaxis es más que recomendable crear una condicional entre las sentencias que se ejecutan, que pueda ejecutar la instrucción break para salir del bucle.

El bucle for también admite la sintaxis alternativa de dos puntos (:) con la palabra (endfor;) como cierre del bucle.

<?php

  $desde=10;
  $hasta=20;
  $resultado=0;
  
// Obtener la suma de los números del 10 al  20 por medio de un bucle for
  for($i=$desde;$i<=$hasta;$i++) {
    $resultado+=$i;
  }

$linea = <<< PARRAFO
<p>La suma de los  números comprendidos entre el $desde y el $hasta es: $resultado</p>
PARRAFO;
echo $linea;

?>
// RESULTADO

La suma de los números comprendidos entre el 10 y el 20 es: 165