Diferencia entre revisiones de «Plantilla:ManuelRomero/PHP/EstructurasControl»

De WikiEducator
Saltar a: navegación, buscar
(Selección con `if`)
 
(15 revisiones intermedias por el mismo usuario no mostrado)
Línea 113: Línea 113:
 
=== Selección con `if` ===
 
=== Selección con `if` ===
 
*La estructura de control ''if'' permite evaluar una ''expresión booleana'' (una condición que puede ser verdadera o falsa).  
 
*La estructura de control ''if'' permite evaluar una ''expresión booleana'' (una condición que puede ser verdadera o falsa).  
*En función de si la expresión es '''true''' o '''false''', el programa ejecutará un bloque de sentencias o lo omitirá, u otro si se especifica.
+
*Siempre la '''expresión booleana''' va entre paréntesis
 +
{{MRM_Puntos clave|title=flujo de ejecución|
 +
; Si la expresión booleana es '''true''' ejecutará un bloque de sentencias
 +
; Si no,  o lo omitirá, o ejecutará otro si se especifica.
 +
}}
 +
 
 +
<gallery>
 +
[[Archivo:estructura_if.png|center|400px]]
 +
[[Archivo:estructura_if_else.png|center|500px]]
 +
 
 +
</gallery>
 +
 
 +
{| class="wikitable" style="text-align: center;"
 +
|-
 +
! Estructura IF
 +
! Estructura IF ELSE
 +
|-
 +
|[[Archivo:estructura_if.png|center|400px]]
 +
|[[Archivo:estructura_if_else.png|center|500px]]
 +
|}
  
 
==== Sintaxis Básica ====
 
==== Sintaxis Básica ====
Línea 151: Línea 170:
  
 
</source>
 
</source>
 +
}}
 +
;Ejercicios: Realiza los siguientes ejercicios
 +
{{Usuario:ManuelRomero/ProgramacionWeb/Sintaxis/ejercicios/ejercicio11}}
 +
{{Usuario:ManuelRomero/ProgramacionWeb/Sintaxis/ejercicios/ejercicio12}}
 +
{{Usuario:ManuelRomero/ProgramacionWeb/Sintaxis/ejercicios/ejercicio13}}
  
 
+
==== If gráficamente (ordinagrama) ====
==== Visualización del `if` ====
+
 
[[Archivo:estructura_if.png|center]]
 
[[Archivo:estructura_if.png|center]]
 
La imagen muestra el flujo de ejecución: si la '''expresión booleana'' es '''true''', se ejecutan las sentencias dentro del bloque `if`; si es '''false''', el flujo continúa después del bloque.
 
La imagen muestra el flujo de ejecución: si la '''expresión booleana'' es '''true''', se ejecutan las sentencias dentro del bloque `if`; si es '''false''', el flujo continúa después del bloque.
Línea 171: Línea 194:
  
 
{{plegable|hidden|Miramos si una edad en mayor o menor de edad|
 
{{plegable|hidden|Miramos si una edad en mayor o menor de edad|
 +
<source lang=php>
 
$edad = rand(1,35);
 
$edad = rand(1,35);
 
if ($edad >= 18) {
 
if ($edad >= 18) {
Línea 178: Línea 202:
 
}
 
}
 
</source>
 
</source>
 
+
}}
 
*Si '''$edad''' es 18 o más, se imprime "Eres mayor de edad". Si '''$edad''' es menor que 18, se imprime "Eres menor de edad".
 
*Si '''$edad''' es 18 o más, se imprime "Eres mayor de edad". Si '''$edad''' es menor que 18, se imprime "Eres menor de edad".
  
==== Visualización del `if...else` ====
+
==== if...else gráfico (Ordinograma) ====
[[Archivo:estructura_if_else.png|center]]
+
[[Archivo:estructura_if_else.png|center|500px]]
 
La imagen muestra que si la condición es **true**, se ejecuta el bloque `if`; si es **false**, se ejecuta el bloque `else`.
 
La imagen muestra que si la condición es **true**, se ejecuta el bloque `if`; si es **false**, se ejecuta el bloque `else`.
 +
 +
;Realiza los siguientes ejercicios
 +
{{Usuario:ManuelRomero/ProgramacionWeb/Sintaxis/ejercicios/ejercicio14}}
 +
{{Usuario:ManuelRomero/ProgramacionWeb/Sintaxis/ejercicios/ejercicio15}}
 +
{{Usuario:ManuelRomero/ProgramacionWeb/Sintaxis/ejercicios/ejercicio100}}
 +
  
 
==== `if...elseif...else` ====
 
==== `if...elseif...else` ====
Línea 217: Línea 247:
  
 
==== Visualización del `if...elseif...else` ====
 
==== Visualización del `if...elseif...else` ====
[[Archivo:estructura_if_elseif.png|center]]
+
[[Archivo:estructura_if_elseif.png|center|700px]]
 
La imagen muestra cómo se evalúan varias condiciones en secuencia hasta que una sea verdadera. Si ninguna lo es, se ejecuta el bloque `else`.
 
La imagen muestra cómo se evalúan varias condiciones en secuencia hasta que una sea verdadera. Si ninguna lo es, se ejecuta el bloque `else`.
  
Línea 252: Línea 282:
  
 
// Escribe el código del ejercicio aquí
 
// Escribe el código del ejercicio aquí
 +
</source>
 +
=== Operador Ternario ===
 +
*El '''operador ternario''' es una forma más compacta de expresar una estructura '''if-else''' en una única línea, ideal cuando se desea evaluar una condición y devolver un valor en función del resultado.
 +
*Esta expresión retorna un valor según la condición especificada.
 +
 +
<source lang=php>
 +
(expresión_booleana) ? valor_si_true : valor_si_false;
 +
</source>
 +
 +
*El valor que retorna es el resultado de la '''expresión''' que corresponda según el valor de la condición. Esta expresión es equivalente a:
 +
 +
<source lang=php>
 +
if (expresión_booleana)
 +
    valor_si_true;
 +
else
 +
    valor_si_false;
 +
</source>
 +
 +
*Usar el operador ternario ayuda a escribir el código de forma más compacta y clara, especialmente en expresiones sencillas.
 +
 +
==== Ejemplo ====
 +
<br />
 +
{{MRM_Actividad|Determinar si un número aleatorio es par o impar}}
 +
 +
{{Plegable|hide|Operador ternario|
 +
Programa para par o impar con operador ternario
 +
<source lang=php>
 +
<?php
 +
$num = rand(1, 100);
 +
echo ($num % 2 == 0) ? "$num es par" : "$num es impar";
 +
?>
 +
</source>
 +
}}
 +
 +
{{Plegable|hide|Estructura if-else|
 +
Programa para par o impar con estructura if-else
 +
<source lang=php>
 +
<?php
 +
$num = rand(1, 100);
 +
if ($num % 2 == 0) {
 +
    echo "$num es par";
 +
} else {
 +
    echo "$num es impar";
 +
}
 +
?>
 +
</source>
 +
}}
 +
 +
<br />
 +
*Este '''operador ternario''' se utiliza mucho en programación, y conviene entenderlo y habituarse a su uso para escribir código más conciso y claro.
 +
 +
=== Selección con `switch` ===
 +
*El operador '''switch''' es un selector múltiple que permite evaluar el valor de una variable o expresión y ejecutar el bloque de código correspondiente al primer caso que coincida.
 +
*En PHP, la sentencia `case` puede albergar valores de cualquier tipo simple (números, cadenas, etc.), no está limitada a enteros como en otros lenguajes.
 +
*Esta estructura es útil cuando tenemos múltiples casos excluyentes y queremos evitar múltiples `if-else`.
 +
 +
==== Sintaxis ====
 +
La sintaxis básica de un `switch` en PHP es:
 +
<source lang=php>
 +
switch ($valor) {
 +
    case "valor1":
 +
        // acciones
 +
        break;
 +
    case "valor2":
 +
        // acciones
 +
        break;
 +
    case "valorn":
 +
        // acciones
 +
        break;
 +
    default:
 +
        // acciones si no hay coincidencia
 +
}
 +
</source>
 +
 +
==== Notas Importantes ====
 +
*El `switch` busca la primera coincidencia de `$valor` con los valores de los casos (`case`) y ejecuta todas las instrucciones posteriores hasta encontrar un `break`.
 +
*Si no se coloca un `break`, continuará ejecutando los casos siguientes, incluso si no coinciden.
 +
 +
==== Ejemplo Básico ====
 +
{{MRM_Ejemplo|Title=Ejemplo: Identificar un Nombre|
 +
*Escribe un programa que evalúe si una variable `$nombre` es "María", "Pedro", o cualquier otro nombre.
 +
 +
{{Plegable|hide|Posible Solución|
 +
<source lang=php>
 +
<?php
 +
$nombre = "Pedro";
 +
 +
switch ($nombre) {
 +
    case "María":
 +
        echo "Eres una chica";
 +
        break;
 +
    case "Pedro":
 +
        echo "Eres un chico";
 +
        break;
 +
    default:
 +
        echo "No sé qué nombre tienes";
 +
}
 +
?>
 +
</source>
 +
}}
 +
}}
 +
 +
==== Ejemplo con Rango de Valores ====
 +
*En algunos casos, queremos evaluar rangos de valores (por ejemplo, edades, calificaciones). En PHP, esto se logra usando expresiones booleanas dentro de los `case` y configurando el `switch` para evaluar `true`.
 +
 +
{{MRM_Ejemplo|Title=Ejemplo: Nivel de Madurez|
 +
*Generar una edad aleatoria entre 0 y 110 y clasificarla según el nivel de madurez:
 +
 +
  - 0–2: Bebé
 +
  - 3–10: Niñez
 +
  - 11–17: Adolescencia
 +
  - 18–26: Juventud
 +
  - 27–59: Adultez
 +
  - 60–80: Experimentado
 +
  - Más de 80: Disfrutando la vida
 +
 +
{{Plegable|hide|Posible Solución|
 +
<source lang=php>
 +
<?php
 +
$edad = rand(0, 110);
 +
 +
switch (true) {
 +
    case ($edad >= 0 && $edad <= 2):
 +
        echo "Con $edad años: Eres un bebé";
 +
        break;
 +
    case ($edad >= 3 && $edad <= 10):
 +
        echo "Con $edad años: Estás en la niñez";
 +
        break;
 +
    case ($edad >= 11 && $edad <= 17):
 +
        echo "Con $edad años: Estás en la adolescencia";
 +
        break;
 +
    case ($edad >= 18 && $edad <= 26):
 +
        echo "Con $edad años: Eres joven";
 +
        break;
 +
    case ($edad >= 27 && $edad <= 59):
 +
        echo "Con $edad años: Eres adulto";
 +
        break;
 +
    case ($edad >= 60 && $edad <= 80):
 +
        echo "Con $edad años: Eres experimentado";
 +
        break;
 +
    default:
 +
        echo "Con $edad años: Disfruta la vida";
 +
}
 +
?>
 +
</source>
 +
}}
 +
}}
 +
 +
==== Casos Curiosos en PHP ====
 +
En PHP, al comparar rangos o expresiones booleanas dentro de un `case`, se recomienda configurar el `switch` para evaluar `true`. Esto evita errores de interpretación con valores como `0`.
 +
 +
**Ejemplo Problemático**:
 +
<source lang=php>
 +
<?php
 +
$nota = 0;
 +
 +
switch ($nota) {
 +
    case ($nota >= 0 && $nota <= 3):
 +
        echo "Nota deficiente";
 +
        break;
 +
    case 4:
 +
        echo "Nota insuficiente";
 +
        break;
 +
    case 5:
 +
        echo "Nota suficiente";
 +
        break;
 +
    case ($nota > 6 && $nota < 9):
 +
        echo "Nota notable";
 +
        break;
 +
    case ($nota >= 9):
 +
        echo "Nota sobresaliente";
 +
        break;
 +
}
 +
?>
 +
</source>
 +
 +
*Si `$nota = 0`, el primer caso no se ejecuta porque PHP convierte `0` a booleano `false`, lo que genera errores lógicos.
 +
 +
**Solución Recomendada**:
 +
<source lang=php>
 +
<?php
 +
$nota = rand(0, 10);
 +
 +
switch (true) {
 +
    case ($nota >= 0 && $nota <= 3):
 +
        echo "Nota deficiente";
 +
        break;
 +
    case $nota == 4:
 +
        echo "Nota insuficiente";
 +
        break;
 +
    case $nota == 5:
 +
        echo "Nota suficiente";
 +
        break;
 +
    case $nota == 6:
 +
        echo "Nota bien";
 +
        break;
 +
    case ($nota >= 7 && $nota <= 8):
 +
        echo "Nota notable";
 +
        break;
 +
    case ($nota >= 9):
 +
        echo "Nota sobresaliente";
 +
        break;
 +
}
 +
?>
 +
</source>
 +
 +
==== Actividad Propuesta ====
 +
*Generar un número aleatorio para el mes (entre 1 y 12) y mostrar el número de días correspondientes. Si el número no corresponde a un mes válido, informar al usuario.
 +
 +
{{Plegable|hide|Posible Solución|
 +
<source lang=php>
 +
<?php
 +
$mes = rand(1, 15);
 +
 +
switch ($mes) {
 +
    case 1: case 3: case 5: case 7: case 8: case 10: case 12:
 +
        echo "$mes es un mes de 31 días";
 +
        break;
 +
    case 4: case 6: case 9: case 11:
 +
        echo "$mes es un mes de 30 días";
 +
        break;
 +
    case 2:
 +
        echo "$mes es un mes de 28 o 29 días (dependiendo del año)";
 +
        break;
 +
    default:
 +
        echo "$mes no es un mes válido";
 +
}
 +
?>
 +
</source>
 +
}}
 +
}}
 +
 +
===Selección con el operador match===
 +
*El operador match aparece en php en la versión 8
 +
*Es una opción depurada y para casos concretos que puede sustituir de forma más eficiente y legigle a la estructura switch-case
 +
{{MRM_Puntos clave|Title=Operador match|
 +
*1.- Siempre retornará un valor
 +
*2.- Evaluamos una expresión, al igual que con switch-case
 +
*3.- En cada una de las ramas puedo establecer varias condiciones separadas por comas, intuyendo en ello una or lógica.
 +
*4.- Igual que en switch-case existe la rama default
 +
*5.- Como va a ser parte de una asignación, debe de terminar en ;
 +
*6.- Las comparaciones que hace son estrictas  a diferenica del switch-case que hace comparaciones no estrictas
 +
}}
 +
*A continuación podemos ver ejemplos
 +
<source lang=php>
 +
$numero_mes = rand(1,15);
 +
$nombre_mes = match ($numero_mes){
 +
1=>"Enero",
 +
2=>"Febrero",
 +
.....
 +
default => "Mes incorrecto"
 +
};
 +
echo "El mes $numero_mes es $nombre_mes"
 +
 +
</source>
 +
* Aquí vemos el uso de varios valores posibles en la comparación
 +
<source lang=php>
 +
 +
```php
 +
$numero_mes = rand(1,15);
 +
$numero_dias=match($mes){ 
 +
    1,3,5,7,8,10,12 => 31, 
 +
    4,6,8,11 =>30, 
 +
    2 => 28 
 +
}; 
 +
echo "El mes $mes tiene $numero_dias días";
 
</source>
 
</source>

Última revisión de 18:54 15 nov 2024

Estructuras de Control

  • Las estructuras de control determinan el flujo de ejecución de un programa
  • Especifican el orden en que se ejecutarán las instrucciones.
  • Existen tres tipos principales de estructuras de control:
  1. Secuenciales: Ejecutan las instrucciones en orden, una tras otra.
  2. Selectivas: Permiten elegir entre diferentes caminos según una condición.
  3. Repetitivas: Ejecutan un bloque de instrucciones varias veces según una condición.
  • Para implementarlas, necesitamos operadores y condiciones, cuya sintaxis vamos a ir estudiando.
  • A modo de resumen, presentamos la siguiente tabla:
Resumen de las estructuras de control
Estructura de Control Sintaxis en PHP Ejemplo
Secuencial
{
   sentencia_1;
   sentencia_2;
   // ...
}
$num = rand(-10,20);
echo "Se ha generado el número $num";
Selectiva
if (expresion_booleana) {
   sentencia_1;
   sentencia_2;
}
sentencia_3;
$num = rand(-10,20);
if ($num < 0) {
   echo "El número $numero es negativo";
}else{
  echo "El número $numero es positivo";
}
Repetitiva
while (expresion_booleana) {
   sentencia_1;
   sentencia_2;
}
sentencia_3;
$num = 0;
$total = 0;
while ($num < 100) {
   $total = $total + $num;
   $num = $num + 1;
}
echo "Los primeros 100 números suman $total";

Instrucciones Secuenciales

  • En Este tipo de estructura de control, las instrucciones se ejecutan una tras otra de.
  • Las instrucciones se ejecutan en el orden en que aparecen, de forma secuencial, sin saltos ni repeticiones en el proceso.
Secuencial.png
  • La imagen muestra un flujo en el que cada paso se realiza de forma consecutiva, de arriba hacia abajo.

Ejemplos de Estructura Secuencial en PHP



Icon casestudy.gif
Operaciones matemáticas en secuencia
<?php
// Asignación de valores a variables
$a = 5;
$b = 10;
$c = $a + $b;  // Se suma $a y $b
$d = $c * 2;   // El resultado se multiplica por 2
echo "El resultado final es $d"; // Imprime el resultado
?>




Icon casestudy.gif
Mostrar mensajes
  • Ejemplo 2: Mostrar mensajes secuenciales
<?php
echo "Primero se ejecuta esta línea.<br />\n";
echo "Luego se ejecuta esta línea.<br />\n";
echo "Finalmente, se ejecuta esta última línea.";
?>



En ambos ejemplos
 * Las instrucciones se ejecutan en orden, sin interrupciones.
 * Cada línea de código sigue a la anterior y se ejecuta solo una vez.
 

Esta estructura es la más simple de las estructuras de control y establece la base para comprender el flujo de ejecución en un programa.

Selección con `if`

  • La estructura de control if permite evaluar una expresión booleana (una condición que puede ser verdadera o falsa).
  • Siempre la expresión booleana va entre paréntesis


Icon key points.gif

Puntos clave

Si la expresión booleana es true ejecutará un bloque de sentencias
Si no, o lo omitirá, o ejecutará otro si se especifica.



Estructura IF Estructura IF ELSE
Estructura if.png
Estructura if else.png

Sintaxis Básica

  • La estructura básica de if es:
if (expresion_booleana)
    Sentencia_1;
  • Si hay más de una sentencia a ejecutar cuando la condición es verdadera, debemos utilizar llaves `{ }` para agrupar el bloque de instrucciones, también lo podemos poner si solo hay una instruccion:
if (expresion_booleana) {
    Sentencia_1;
    Sentencia_2;
}
if (expresion_booleana){
    Sentencia_1;
}
La indentación
  • Es muy importante la indentación.
  • Consiste en dejar espacios o sangrías al inicio de cada línea de código dentro de un bloque.
  • Esto ayuda a visualizar la estructura y jerarquía de las instrucciones, facilitando la lectura y comprensión del código.
  • Una buena indentación es fundamental para evitar errores y mantener el código organizado0.
Ejemplos
Ejercicios
Realiza los siguientes ejercicios


Icon activity.jpg
Ejercicio 11:Probando variables de variables
  • Declaramos el precio de 5 productos de hortalizas
  • Declaramos la variable $producto
  • Vamos visualizando el producto y su precio cambiando solo el valor del producto por el nombre de la hortaliza escribiendo la cadena
 echo "<h1>El precio de $producto es ${$producto}</h1>";





Icon activity.jpg
Ejercicio 12: Selección simple
  • Generamos un número aleatoria entre 1 y 100
  • Si el número es par informamos que ha ganado un premio
  • En cualquier caso mostramos el número obtenido





Icon activity.jpg
Ejercicio 13: Selección simple 2
  • Generamos una edad entre 1 y 90 años
  • Mostraremos la edad generada
  • En caso de tener menos de 18 años informaremos de ello en un mensaje en rojo




If gráficamente (ordinagrama)

Estructura if.png

La imagen muestra el flujo de ejecución: si la expresión booleana es true', se ejecutan las sentencias dentro del bloque `if`; si es false, el flujo continúa después del bloque.

`if...else`

  • Podemos añadir una estructura else para especificar un bloque de sentencias que se ejecutará solo cuando la condición sea false.
if (expresion_booleana) {
    bloque_de_sentencias_1;
} else {
    bloque_de_sentencias_2;
}
Ejemplo de `if...else`
{{plegable|hidden|Miramos si una edad en mayor o menor de edad|
<source lang=php>
$edad = rand(1,35);
if ($edad >= 18) {
    echo "Eres mayor de edad.";
} else {
    echo "Eres menor de edad.";
}

}}

  • Si $edad es 18 o más, se imprime "Eres mayor de edad". Si $edad es menor que 18, se imprime "Eres menor de edad".

if...else gráfico (Ordinograma)

Estructura if else.png

La imagen muestra que si la condición es **true**, se ejecuta el bloque `if`; si es **false**, se ejecuta el bloque `else`.

Realiza los siguientes ejercicios



Icon activity.jpg
Ejercicio 14: Selección simple completa
  • Generamos una edad entre 1 y 90 años
  • El programa nos dirá si la edad generada es o no mayor de edad





Icon activity.jpg
Mostrar nombre mes
  • Generamos un número entre 1 y 15
  • Mostramos el número del mes y su nombre (el que correspondiente al número: enero, febrero, ...
  • En caso de ser mayor de 12 mostraremos mes incorrecto
  • Usamos la estructura
if (..)
       ...
 elseif
       ...
 elseif 
       ...
 ...
 else
     ....





Icon activity.jpg
Ecuación segundo grado
  • Se trata de encontrar dos valores para que la ecuación se satisfaga (que sea 0)
  • La ecuación que lo resuelve también se aporta
E1g.png
Podemos ver la ecuación que resuelve el problema
E1g analisis.png




`if...elseif...else`

  • La estructura `if...elseif...else` permite evaluar múltiples condiciones en secuencia. Solo se ejecutará el bloque correspondiente a la primera condición verdadera.
if (expresion_booleana_1) {
    bloque_sentencias_1;
} elseif (expresion_booleana_2) {
    bloque_sentencias_2;
} elseif (expresion_booleana_3) {
    bloque_sentencias_3;
} else {
    bloque_sentencias_4;
}

Ejemplo de `if...elseif...else`

$nota = 85;
if ($nota >= 90) {
    echo "Excelente";
} elseif ($nota >= 75) {
    echo "Bueno";
} elseif ($nota >= 50) {
    echo "Aprobado";
} else {
    echo "Reprobado";
}
  • En este ejemplo, dependiendo del valor de `$nota`, el programa imprime un mensaje diferente. Solo se ejecuta el bloque de la primera condición verdadera.

Visualización del `if...elseif...else`

Estructura if elseif.png

La imagen muestra cómo se evalúan varias condiciones en secuencia hasta que una sea verdadera. Si ninguna lo es, se ejecuta el bloque `else`.

Sintaxis Alternativa

  • PHP permite una sintaxis alternativa para `if`, `else`, y `elseif`, especialmente útil cuando se intercala código HTML:
if (condicion):
    Sentencia_1;
elseif (otra_condicion):
    Sentencia_2;
else:
    Sentencia_3;
endif;
  • Ejemplo con HTML:
<?php if (true): ?>
    <h1>Este contenido se mostrará</h1>
<?php else: ?>
    <h1>Este contenido no se mostrará</h1>
<?php endif; ?>

Ejercicio Propuesto

  • Escribe un programa que evalúe la temperatura y muestre un mensaje según el rango:
 - Si la temperatura es menor que 0: "Hace mucho frío".
 - Si la temperatura está entre 0 y 15: "Hace frío".
 - Si la temperatura está entre 15 y 30: "Temperatura agradable".
 - Si la temperatura es mayor que 30: "Hace calor".
$temp = rand(-10, 40); // Genera una temperatura aleatoria
echo "La temperatura actual es $temp grados.\n";
 
// Escribe el código del ejercicio aquí

Operador Ternario

  • El operador ternario es una forma más compacta de expresar una estructura if-else en una única línea, ideal cuando se desea evaluar una condición y devolver un valor en función del resultado.
  • Esta expresión retorna un valor según la condición especificada.
(expresión_booleana) ? valor_si_true : valor_si_false;
  • El valor que retorna es el resultado de la expresión que corresponda según el valor de la condición. Esta expresión es equivalente a:
if (expresión_booleana)
    valor_si_true;
else
    valor_si_false;
  • Usar el operador ternario ayuda a escribir el código de forma más compacta y clara, especialmente en expresiones sencillas.

Ejemplo



Icon activity.jpg
Actividad
Determinar si un número aleatorio es par o impar




  • Este operador ternario se utiliza mucho en programación, y conviene entenderlo y habituarse a su uso para escribir código más conciso y claro.

Selección con `switch`

  • El operador switch es un selector múltiple que permite evaluar el valor de una variable o expresión y ejecutar el bloque de código correspondiente al primer caso que coincida.
  • En PHP, la sentencia `case` puede albergar valores de cualquier tipo simple (números, cadenas, etc.), no está limitada a enteros como en otros lenguajes.
  • Esta estructura es útil cuando tenemos múltiples casos excluyentes y queremos evitar múltiples `if-else`.

Sintaxis

La sintaxis básica de un `switch` en PHP es:

switch ($valor) {
    case "valor1":
        // acciones
        break;
    case "valor2":
        // acciones
        break;
    case "valorn":
        // acciones
        break;
    default:
        // acciones si no hay coincidencia
}

Notas Importantes

  • El `switch` busca la primera coincidencia de `$valor` con los valores de los casos (`case`) y ejecuta todas las instrucciones posteriores hasta encontrar un `break`.
  • Si no se coloca un `break`, continuará ejecutando los casos siguientes, incluso si no coinciden.

Ejemplo Básico

Icon casestudy.gif
Ejemplo: Identificar un Nombre
  • Escribe un programa que evalúe si una variable `$nombre` es "María", "Pedro", o cualquier otro nombre.



Ejemplo con Rango de Valores

  • En algunos casos, queremos evaluar rangos de valores (por ejemplo, edades, calificaciones). En PHP, esto se logra usando expresiones booleanas dentro de los `case` y configurando el `switch` para evaluar `true`.



Icon casestudy.gif
Ejemplo: Nivel de Madurez
  • Generar una edad aleatoria entre 0 y 110 y clasificarla según el nivel de madurez:
 - 0–2: Bebé
 - 3–10: Niñez
 - 11–17: Adolescencia
 - 18–26: Juventud
 - 27–59: Adultez
 - 60–80: Experimentado
 - Más de 80: Disfrutando la vida



Casos Curiosos en PHP

En PHP, al comparar rangos o expresiones booleanas dentro de un `case`, se recomienda configurar el `switch` para evaluar `true`. Esto evita errores de interpretación con valores como `0`.

    • Ejemplo Problemático**:
<?php
$nota = 0;
 
switch ($nota) {
    case ($nota >= 0 && $nota <= 3):
        echo "Nota deficiente";
        break;
    case 4:
        echo "Nota insuficiente";
        break;
    case 5:
        echo "Nota suficiente";
        break;
    case ($nota > 6 && $nota < 9):
        echo "Nota notable";
        break;
    case ($nota >= 9):
        echo "Nota sobresaliente";
        break;
}
?>
  • Si `$nota = 0`, el primer caso no se ejecuta porque PHP convierte `0` a booleano `false`, lo que genera errores lógicos.
    • Solución Recomendada**:
<?php
$nota = rand(0, 10);
 
switch (true) {
    case ($nota >= 0 && $nota <= 3):
        echo "Nota deficiente";
        break;
    case $nota == 4:
        echo "Nota insuficiente";
        break;
    case $nota == 5:
        echo "Nota suficiente";
        break;
    case $nota == 6:
        echo "Nota bien";
        break;
    case ($nota >= 7 && $nota <= 8):
        echo "Nota notable";
        break;
    case ($nota >= 9):
        echo "Nota sobresaliente";
        break;
}
?>

Actividad Propuesta

  • Generar un número aleatorio para el mes (entre 1 y 12) y mostrar el número de días correspondientes. Si el número no corresponde a un mes válido, informar al usuario.

}}

Selección con el operador match

  • El operador match aparece en php en la versión 8
  • Es una opción depurada y para casos concretos que puede sustituir de forma más eficiente y legigle a la estructura switch-case


Icon key points.gif

Operador match

  • 1.- Siempre retornará un valor
  • 2.- Evaluamos una expresión, al igual que con switch-case
  • 3.- En cada una de las ramas puedo establecer varias condiciones separadas por comas, intuyendo en ello una or lógica.
  • 4.- Igual que en switch-case existe la rama default
  • 5.- Como va a ser parte de una asignación, debe de terminar en ;
  • 6.- Las comparaciones que hace son estrictas a diferenica del switch-case que hace comparaciones no estrictas


  • A continuación podemos ver ejemplos
$numero_mes = rand(1,15);
$nombre_mes = match ($numero_mes){
	1=>"Enero",
	2=>"Febrero",
	.....
	default => "Mes incorrecto"
};
echo "El mes $numero_mes es $nombre_mes"
  • Aquí vemos el uso de varios valores posibles en la comparación
```php
$numero_mes = rand(1,15);
$numero_dias=match($mes){  
    1,3,5,7,8,10,12 => 31,  
    4,6,8,11 =>30,  
    2 => 28  
};  
echo "El mes $mes tiene $numero_dias días";