4.1.3. Sentencias de control

Las sentencias de control permiten ejecutar bloque de códigos dependiendo de condiciones. La evaluación de dichas condiciones retorna uno de dos valores verdadero o falso. Para PHP el 0 es equivalente a falso y cualquier otro número es verdadero.

if...else

La sentencia if...else permite ejecutar un bloque de instrucciones si la condición es verdadera y otro bloque de instrucciones si ésta es falsa. Es importante tener en cuenta que la condición que evaluemos estará encerrada entre paréntesis (esto es aplicable a todas la sentencias de control).

if (condición) {
   //Se ejecuta si la condición es VERDADERA
} else {
   //Se ejecuta si la condición es FALSA
}

Ejemplo: Determinar si n es par o impar

<!DOCTYPE html>
<html lang='es'>
<head>
  <meta charset='utf-8'>
  <meta name='viewport' content='width=device-width, initial-scale=1'>
  <meta http-equiv='x-ua-compatible' content='ie=edge'>
  <title>Operadores Aritméticos</title>
  <link href='http://netdna.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css' rel='stylesheet'>
  <link href='../formValidation/css/formValidation.min.css' rel='stylesheet'>
</head>
<body>
<div class='container'>
  <form id='pacheco' class='form-horizontal' name='pacheco' method="post">
    <fieldset> 
      <legend class='text-center'>Sentrencia de control <b>if</b></legend>
      <div class='form-group'>
        <label class='control-label col-sm-2' for='n'>n</label>
        <div class='col-sm-3'>
          <input id='n' class='form-control' name='n'>
        </div>
      </div>
     
      <div class="form-group"> 
        <div class="col-xs-9 col-xs-offset-3">
          <button type="submit" class="btn btn-primary">Validar</button>
          <button type="button" class="btn btn-default" id="resetButton">Reset</button>        
        </div>  
      </div>
    </fieldset>
  </form>
  <div class='row'>     
     <div class="col-sm-offset-2 col-sm-6" id="message"></div>
  </div>
</div>
<!-- Código jQuery --> 
</body>
</html>
  <script src='http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js'></script>
  <script src='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js'></script>
  <script src='../formValidation/js/formValidation.js'></script>
  <script src='../formValidation/js/framework/bootstrap.min.js'></script>
  <script>
$(document).ready(function() {
  $('#pacheco') .formValidation({
    err: {
      container: 'tooltip'
    },
	icon: {
      valid: 'glyphicon glyphicon-ok',
      invalid: 'glyphicon glyphicon-remove',
      validating: 'glyphicon glyphicon-refresh'
    },
    fields: {
      n: {
        validators: {
		  notEmpty: { message: 'El valor no puede ser nulo'},
		  integer: { message: 'El número no es un entero' }	
        }
      }
    }
  })
  .on('err.field.fv', function(e, data) {
    // Get the tooltip
    var $icon = data.element.data('fv.icon'), title = $icon.data('bs.tooltip').getTitle();
   
    // Destroy the old tooltip and crete a new one positioned to the right
    $icon.tooltip('destroy').tooltip({
      html: true,
      placement: 'right',
      title: title,
      container: 'body'
    });
  })
  
  .on('success.form.fv', function(e) {
      // Prevent form submission
      e.preventDefault();

      // Get the form instance
      var $form = $(e.target);

      // Get the FormValidation instance
  //    var bv = $form.data('formValidation');
        
      $.post('04SentCont01.php', $("#pacheco").serializeArray(),
	          function(data) { $('#message').html(data); }
      );
    });
	
    // Reset the Tooltip container form
    $('#resetButton').on('click', function(e) {
        var fields = $('#tooltipContainerForm').data('formValidation').getOptions().fields,
            $parent, $icon;

        for (var field in fields) {
            $parent = $('[name="' + field + '"]').parents('.form-group');
            $icon   = $parent.find('.form-control-feedback[data-fv-icon-for="' + field + '"]');
            $icon.tooltip('destroy');
        }

        // Then reset the form
        $('#tooltipContainerForm').data('formValidation').resetForm(true);
    });
	
  });
  </script>
<?php
  $n = $_POST['n'];
  if($_SERVER['REQUEST_METHOD'] == 'POST' ){
    if( isset($n) ){
	  if( ( $n % 2 ) == 0 ) {
        $cadena = "$n es par";
	  } else $cadena = "$n es impar";
      echo $cadena;
    }
  }	
?>

Existe una forma sencilla de usar la sentencia if cuando no tenemos que usar el else y solo tenenemos que ejecutar una línea de código.

$a = 6;
if ($a > 4) echo "$a es mayor que 4";

Ejemplo: Cálculo del área y perímetro de un triángulo dados sus lados, mediante la formula de Herón. Note que si el radical de área es negativo, los lados proporcionados no forman un triángulo



<!DOCTYPE html>
<html lang='es'>
<head>
  <meta charset='utf-8'>
  <meta name='viewport' content='width=device-width, initial-scale=1'>
  <meta http-equiv='x-ua-compatible' content='ie=edge'>
  <title>Operadores Aritméticos</title>
  <link href='http://netdna.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css' rel='stylesheet'>
  <link href='../formValidation/css/formValidation.min.css' rel='stylesheet'>
</head>
<body>
<div class='container'>
  <form id='pacheco' class='form-horizontal' name='pacheco' method="post">
    <fieldset> 
      <legend class='text-center'>Sentrencia de control <b>if</b></legend>
      <div class='form-group'>
        <label class='control-label col-sm-2' for='a'>a</label>
        <div class='col-sm-3'>
          <input id='a' class='form-control' name='a'>
        </div>
      </div>
      <div class='form-group'>
        <label class='control-label col-sm-2' for='b'>b</label>
        <div class='col-sm-3'>
          <input id='b' class='form-control' name='b'>
        </div>
      </div>
      <div class='form-group'>
        <label class='control-label col-sm-2' for='c'>c</label>
        <div class='col-sm-3'>
          <input id='c' class='form-control' name='c'>
        </div>
      </div>
     
      <div class='form-group'> 
        <div class='col-xs-9 col-xs-offset-3'>
          <button type='submit' class='btn btn-primary'>Validar</button>
          <button type='button' class='btn btn-primary' id='resetButton'>Reset</button>        
        </div>  
      </div>
    </fieldset>
  </form>
  <div class='row'>     
     <div class='col-sm-offset-2 col-sm-6' id='message'></div>
  </div>
</div>
<!-- Script jQuery -->
</body>
</html>
<script src='http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js'></script>
<script src='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js'></script>
<script src='../formValidation/js/formValidation.js'></script>
<script src='../formValidation/js/framework/bootstrap.min.js'></script>
<script>
$(document).ready(function() {
  $('#pacheco') .formValidation({
    err: {
      container: 'tooltip'
    },
	icon: {
      valid: 'glyphicon glyphicon-ok',
      invalid: 'glyphicon glyphicon-remove',
      validating: 'glyphicon glyphicon-refresh'
    },
    fields: {
      a: {
        validators: {
		  notEmpty: { message: 'El valor no puede ser nulo'},
          greaterThan: {
            value: 1,
            message: 'El valor debe ser mayor o igual a 1'
          }
        }
      },
      b: {
        validators: {
		  notEmpty: { message: 'El valor no puede ser nulo'},
          greaterThan: {
            value: 1,
            message: 'El valor debe ser mayor o igual a 1'
          }
        }
      },
      c: {
        validators: {
		  notEmpty: { message: 'El valor no puede ser nulo'},
          greaterThan: {
            value: 1,
            message: 'El valor debe ser mayor o igual a 1'
          }
        }
      }	  
    }
  })
  .on('err.field.fv', function(e, data) {
    // Get the tooltip
    var $icon = data.element.data('fv.icon'), title = $icon.data('bs.tooltip').getTitle();
   
    // Destroy the old tooltip and crete a new one positioned to the right
    $icon.tooltip('destroy').tooltip({
      html: true,
      placement: 'right',
      title: title,
      container: 'body'
    });
  })
  
  .on('success.form.fv', function(e) {
      // Prevent form submission
      e.preventDefault();

      // Get the form instance
      var $form = $(e.target);
        
      $.post('04Triangulo.php', $("#pacheco").serializeArray(),
	          function(data) { $('#message').html(data); }
      );
    });
	
    // Reset the Tooltip container form
    $('#resetButton').on('click', function(e) {
        var fields = $('#tooltipContainerForm').data('formValidation').getOptions().fields,
            $parent, $icon;

        for (var field in fields) {
            $parent = $('[name="' + field + '"]').parents('.form-group');
            $icon   = $parent.find('.form-control-feedback[data-fv-icon-for="' + field + '"]');
            $icon.tooltip('destroy');
        }

        // Then reset the form
        $('#tooltipContainerForm').data('formValidation').resetForm(true);
    });
	
  });
</script>
<?php
  $a = $_POST['a'];
  $b = $_POST['b'];
  $c = $_POST['c'];
  if( $_SERVER['REQUEST_METHOD'] == 'POST' ) {
     $perimetro = $a + $b + $c; //semiperimetro
     $p = $perimetro/2;
     $radical = $p*($p - $a) * ($p - $b) * ($p - $c);
     if($radical < 0 ) {
        $resultado = 'No es un triángulo'."<br />";
     } else {
         $resultado  = '<b>Área = </b>'.sqrt($radical).'<br>';
         $resultado .= '<b>Perímetro </b>= '.$perimetro.'<br>';
     }
     echo $resultado;
  }
?>

switch...case...default

Una alternativa a if...elseif...else, es  la sentencia switch, la cual evalúa y compara cada expresión de la sentencia case con la expresión que evaluamos, si llegamos al final de la lista de case y no encontramos condición verdadera, ejecuta el código de bloque que haya en la sentencia default.

Si encontramos una condición verdadera debemos ejecutar un break para que la sentencia switch no siga buscando en la lista de case.

Ejemplo: El siguiente código imprime el día de la semana actual.

<?php
  switch (date('D')) {
    case 'Mons': echo 'Hoy es Lunes'; break;
    case 'Tue': echo 'Hoy es Martes'; break;
    case 'Wed': echo 'Hoy es Miercoles'; break;
    case 'Thu': echo 'Hoy es Jueves'; break;
    case 'Fri': echo 'Hoy es Viernes'; break;
    case 'Sat': echo 'Hoy es Sábado'; break;
    case 'Sun': echo 'Hoy es Domingo'; break;
    default: echo 'Esa cadena no corresponde a ningún día de la semana';
  }
?>

Estructuras de control repetitivas/interactivas

A menudo es necesario ejecutar una instrucción o un bloque de instrucciones más de una vez

Ejemplo:

for

El bucle for resulta muy útil cuando debemos ejecutar un bloque de código a condición de que una variable se encuentre entre un valor mínimo y otro máximo. El bucle for se puede romper mediante la sentencia break.

Ejemplo:

<?php
  for ($num = 1; $num <= 5; $num++){
    echo $num.'<br>';
    if ($num == 3){
        echo 'Aquí nos salimos \n';
        break;
    }
  }
?>

Ejemplo: Calcular una tabla multiplicar. La selección de la tabla se hace mediante la generación de un número aleatorio.

<?php
    $tabla = mt_rand( 1, 10);
    $html = '<table>';
    for($i = 1; $i <= 10; $i++) {
	    $html .= '<tr>';
	    $r     = $tabla*$i;
	    $html .= "<td>$tabla</td><td>*</td><td>$i</td>";
       $html .= "<td>=</td><td>$r</td>"; 
		$html .= '</tr>';
    }
    echo $html.'</table>';
?>

while

La sentencia while ejecuta un bloque de código mientras se cumpla una determinada condición. Podemos romper un bucle while utilizando la sentencia break.

El siguiente código dado por la formula abajo mencionada, calcula el factorial de n. El valor de n debe ser menor o igual a 69 por el tipo de variables que maneja PHP.

La función number_format nos permite formatear los números con comas para separar los miles (Línea 15)

<?php
  $enviar = $_POST['enviar'];
  if( isset($enviar) && $_SERVER['REQUEST_METHOD'] == 'POST') {	 
     $n = $_POST['n'];
     if($n  >= 0 && $n <= 1) {
     	 $factorial = 1;
	 } elseif( $n >= 2 and $n <= 69) {
     	 $factorial = 1;
		 $i = 2;
		 while ( $i <= $n ) { 
		   $factorial *= $i++;
		 }
	 } else $factorial = 'indefinido'; 
     $html = "<p class='centrado'>El factorial de $n es ";
	   $html.= number_format($factorial, 0, '.',',')."</p>";
     echo $html;
?>

El código factorial se puede optimizar y calcularlo para cualquier valor positivo mediante otros mecanismos. Estos métodps escapan del alcance del curso pero son muy útiles es estadística inferencial.

do..while

Esta sentencia es similar a while, salvo que con esta sentencia primero ejecutamos el bloque de código y después se evalúa la condición, por lo que el bloque de código se ejecuta siempre al menos una vez.

Ejemplo: Calcularemos el factorial de n con la sentencia do while

<?php
    if( $_SERVER['REQUEST_METHOD'] == 'POST') {	 
      $n = $_POST['n'];
	  if($n >= 0 and $n <= 1) {
		  $factorial = 1;	
	  } elseif( $n < 0 or $n >69) {
		 $factorial = 'indefenido';
	  } else {
		  $i = 2;
		  $factorial = 1;
          do {
			  $factorial *= $i++;
	      } while ($i <= $n);
	  }
	  $html = "<p align='text-center'>El factorial de $n es ";
	  $html .= number_format($factorial, 0, '.',',').'</p>';
	  echo $html;
  ?>

El usar while, do while o for es principalmente cuestión de preferencia personal.