Diferencia entre revisiones de «Plantilla:ManuelRomero/PHP/EstructurasControlSelectiva»
(24 revisiones intermedias por el mismo usuario no mostrado) | |||
Línea 1: | Línea 1: | ||
+ | __NOTOC__ | ||
<div style="float:none; clear:none; margin:0 0.3em 0.5em 0; padding:0.5em 1.4em 0.8em 0;"> | <div style="float:none; clear:none; margin:0 0.3em 0.5em 0; padding:0.5em 1.4em 0.8em 0;"> | ||
<div id="toc" class="toc"> | <div id="toc" class="toc"> | ||
<div id="toctitle"> | <div id="toctitle"> | ||
− | + | ===Tabla de contenidos=== | |
</div> | </div> | ||
− | + | * [[#Estructuras de Control|1. Estructuras de Control]] | |
− | + | ||
− | * [[# | + | |
* [[#Instrucciones_Secuenciales|2. Instrucciones Secuenciales]] | * [[#Instrucciones_Secuenciales|2. Instrucciones Secuenciales]] | ||
− | ** [[#Ejemplos_de_Estructura_Secuencial_en_PHP| | + | ** [[#Ejemplos_de_Estructura_Secuencial_en_PHP|2.1 Ejemplos de Estructura Secuencial en PHP]] |
− | * | + | * [[#Selección con if|3. Selección con if]] |
− | ** | + | ** [[#Sintaxis_Básica|3.1 Sintaxis Básica]] |
− | ** | + | ** [[#If_gráficamente_(ordinagrama)|3.2 If gráficamente (ordinagrama)]] |
− | ** | + | ** [[#if_else|3.3 `if...else`]] |
− | *** | + | *** [[#if_else_gráfico_(Ordinograma)|3.3.1 `if...else` gráfico (Ordinograma)]] |
− | ** | + | ** [[#if_elseif_else|3.4 `if...elseif...else`]] |
− | *** 3.4.1 | + | *** [[#Ejemplo_de_if_elseif_else|3.4.1 Ejemplo de `if...elseif...else`]] |
− | *** 3.4.2 | + | *** [[#Visualización_del_if_elseif_else|3.4.2 Visualización del `if...elseif...else`]] |
− | *** 3.4.3 | + | *** [[#Sintaxis_Alternativa|3.4.3 Sintaxis Alternativa]] |
− | ** | + | ** [[#Ejercicio_Propuesto|3.5 Ejercicio Propuesto]] |
− | * | + | * [[#Operador_Ternario|4. Operador Ternario]] |
− | ** | + | ** [[#Ejemplo|4.1 Ejemplo]] |
− | * | + | * [[#Selección_con_switch|5. Selección con switch]] |
− | ** | + | ** [[#Sintaxis|5.1 Sintaxis]] |
− | ** | + | ** [[#Notas_Importantes|5.2 Notas Importantes]] |
− | ** | + | ** [[#Ejemplo_Básico|5.3 Ejemplo Básico]] |
− | ** | + | ** [[#Ejemplo_con_Rango_de_Valores|5.4 Ejemplo con Rango de Valores]] |
− | ** | + | ** [[#Casos_Curiosos_en_PHP|5.5 Casos Curiosos en PHP]] |
− | ** | + | ** [[#Actividad_Propuesta|5.6 Actividad Propuesta]] |
− | * | + | * [[#Selección_con_el_operador_match|6. Selección con el operador match]] |
− | ** | + | ** [[#Ejemplo Operador Match|6.1 Ejemplo Operador Match]] |
− | + | ||
</div> | </div> | ||
</div> | </div> | ||
− | |||
− | |||
=== Estructuras de Control === | === Estructuras de Control === | ||
Línea 155: | Línea 152: | ||
{{BotonIndice | {{BotonIndice | ||
− | |enlace=# | + | |enlace=#Tabla de contenidos |
|texto=Volver al índice | |texto=Volver al índice | ||
}} | }} | ||
Línea 230: | Línea 227: | ||
*Los '''operadores de comparación''' permiten comparar dos valores. Estos valores dependen de los [tipos que tengan asignados](http://php.net/manual/es/language.types.type-juggling.php). | *Los '''operadores de comparación''' permiten comparar dos valores. Estos valores dependen de los [tipos que tengan asignados](http://php.net/manual/es/language.types.type-juggling.php). | ||
*Pueden verse las diferencias comparativas en la [tabla de comparación de tipos](http://php.net/manual/es/types.comparisons.php). | *Pueden verse las diferencias comparativas en la [tabla de comparación de tipos](http://php.net/manual/es/types.comparisons.php). | ||
− | + | {| class="wikitable" style="background-color:#f9f9f9; border:1px solid #ddd; width:80%; text-align:left;" | |
− | {| class="wikitable" | + | |+ '''Operadores de comparación''' |
− | |+ Operadores de comparación | + | |
|- | |- | ||
− | ! | + | ! style="background-color:#e0e0e0;" | '''Ejemplo''' !! '''Nombre''' !! '''Resultado''' |
|- | |- | ||
− | | $x == $y || Igual || true, si son iguales (adapta tipos, lo analizaremos). | + | | $x == $y || Igual || '''true''', si son iguales (adapta tipos, lo analizaremos). |
|- | |- | ||
− | | $x === $y || Idéntico || true, si son exactamente iguales (valor y tipo). | + | | $x === $y || Idéntico || '''true''', si son exactamente iguales (valor y tipo). |
|- | |- | ||
− | | $x != $y || Distinto || true, si son diferentes | + | | $x != $y || Distinto || '''true''', si son diferentes (adapta tipos, lo analizaremos). |
− | + | ||
|- | |- | ||
− | | $x | + | | $x <> $y || Distinto || '''true''', si son diferentes (adapta tipos, lo analizaremos). |
|- | |- | ||
− | | $x | + | | $x !== $y || No idéntico || '''true''', si son diferentes (valor y tipo). |
|- | |- | ||
− | | $x | + | | $x < $y || Menor que || '''true''', si $x es menor que $y. |
|- | |- | ||
− | | $x | + | | $x > $y || Mayor que || '''true''', si $x es mayor que $y. |
|- | |- | ||
− | | $x >= $y || Mayor o igual que || true, si $x es mayor o igual que $y. | + | | $x <= $y || Menor o igual que || '''true''', si $x es menor o igual que $y. |
+ | |- | ||
+ | | $x >= $y || Mayor o igual que || '''true''', si $x es mayor o igual que $y. | ||
|} | |} | ||
+ | |||
{{Nota| PHP si comparo valores de diferentes tipo, va a realizar conversiones que veremos más adelante | {{Nota| PHP si comparo valores de diferentes tipo, va a realizar conversiones que veremos más adelante | ||
Línea 261: | Línea 259: | ||
Los operadores lógicos permiten combinar expresiones booleanas para realizar evaluaciones más complejas. | Los operadores lógicos permiten combinar expresiones booleanas para realizar evaluaciones más complejas. | ||
− | {| class="wikitable" | + | {| class="wikitable" style="background-color:#f9f9f9; border:1px solid #ddd; width:70%; text-align:left;" |
− | |+ Operadores Lógicos | + | |+ '''Operadores Lógicos''' |
|- | |- | ||
− | ! | + | ! style="background-color:#e0e0e0; padding:5px;" | '''Operador''' !! style="background-color:#e0e0e0; padding:5px;" | '''Resultado''' |
|- | |- | ||
− | | $x and $y || true si $x y $y son true. | + | | $x and $y || '''true''' si $x y $y son '''true'''. |
|- | |- | ||
− | | $x | + | | $x && $y || '''true''' si $x y $y son '''true'''. |
|- | |- | ||
− | | $x | + | | $x or $y || '''true''' si uno de los dos es '''true''' (o los dos). |
|- | |- | ||
− | | | + | | $x <nowiki>||</nowiki> $y || '''true''' si uno de los dos es '''true''' (o los dos). |
|- | |- | ||
− | | $x | + | | !$x || '''true''' si $x '''no''' es '''true''' (Es para negar algo=. |
|- | |- | ||
− | | $x | + | | $x xor $y || '''true''' si '''sólo uno''' de los dos es '''true''' (No muy usado). |
+ | |||
+ | |||
|} | |} | ||
Línea 496: | Línea 496: | ||
|texto=Volver al índice | |texto=Volver al índice | ||
}} | }} | ||
+ | {{Usuario:ManuelRomero/ProgramacionWeb/Sintaxis/ejercicios/17_TirarDado}} | ||
+ | |||
=== Selección con switch === | === 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. | *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. | ||
Línea 670: | Línea 672: | ||
}} | }} | ||
− | |||
− | |||
*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. | *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. | ||
Línea 696: | Línea 696: | ||
}} | }} | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
===Selección con el operador match=== | ===Selección con el operador match=== | ||
− | *El operador match aparece en php en la versión 8 | + | *El operador '''match''' aparece en php en la versión 8 |
− | *Es una opción depurada y para casos concretos que puede sustituir | + | *Es una opción depurada y para casos concretos que puede sustituir a la estructura switch-case |
+ | *A diferencia del '''switch-case''', es un '''operador''', y por lo tanto '''devuelve un valor'''. | ||
+ | ;Su sintaxis: | ||
+ | <source lang=php> | ||
+ | $variable = match($valor){ | ||
+ | valor_rama_1 => valor_retornado_rama_1, | ||
+ | valor_rama_2 => valor_retornado_rama_2, | ||
+ | .... | ||
+ | default => valor_retornado_si_ninguna_coincidencia_anterior | ||
+ | }; | ||
+ | </source> | ||
+ | {{MRM_Puntos clave|title=Observa| | ||
+ | *1.- Lo que retorne '''lo asigno''' a una variable | ||
+ | <source lang=php> | ||
+ | $variable = match ($valor){ | ||
+ | .... | ||
+ | }; | ||
+ | </source> | ||
+ | *2.- En cada rama tengo '''dos partes''' separadas por el operador '''<nowiki>=></nowiki>''': | ||
+ | ** El valor con el que comparo | ||
+ | ** El valor que retorno si hay un match (coincidencia) | ||
+ | <source lang=php> | ||
+ | valor_rama_1 => valor_retornado_rama_1, | ||
+ | </source> | ||
+ | *3. Puedo tener una rama de '''default''' | ||
+ | <source lang=php> | ||
+ | default => valor_retornado_si_ninguna_coincidencia_anterior | ||
+ | </source> | ||
+ | *4. Al final hay un punto y coma, ya que termina la asignación | ||
+ | <source lang=php> | ||
+ | $variable = match ($valor){ | ||
+ | .... | ||
+ | }; | ||
+ | </source> | ||
+ | }} | ||
+ | |||
{{MRM_Puntos clave|Title=Operador match| | {{MRM_Puntos clave|Title=Operador match| | ||
− | *1.- Siempre retornará un valor | + | *1.- Siempre '''retornará un valor'''. |
− | *2.- Evaluamos | + | *2.- '''Evaluamos un valor''', 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. | + | *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 | + | *4.- Igual que en switch-case existe '''la rama default'''. |
− | *5.- Como va a ser parte de una asignación, debe de terminar en ; | + | *5.- Como va a ser parte de una asignación, debe de terminar en ''';''' (punto y comoa). |
− | *6.- Las comparaciones que hace son estrictas a diferenica del switch-case que hace comparaciones no estrictas | + | *6.- Las comparaciones que hace '''son estrictas''' a diferenica del switch-case que hace comparaciones no estrictas |
}} | }} | ||
*A continuación podemos ver ejemplos | *A continuación podemos ver ejemplos | ||
Línea 741: | Línea 770: | ||
|texto=Volver al índice | |texto=Volver al índice | ||
}} | }} | ||
+ | ;Ejercicio | ||
+ | {{Usuario:ManuelRomero/ProgramacionWeb/Sintaxis/ejercicios/Calculadora}} |
Última revisión de 17:40 25 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:
- Secuenciales: Ejecutan las instrucciones en orden, una tras otra.
- Selectivas: Permiten elegir entre diferentes caminos según una condición.
- 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:
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.
- 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
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 ?>
|
Mostrar mensajes
| |
<?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
|
Estructura IF | Estructura IF ELSE |
---|---|
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.
Expresiones booleanas
(: Las expresiones booleanas las veremos en el capítulo siguiente Expresiones.
- Esto es una introducción para poderlas utilizar en las estructuras de control.
)
Es un conjunto de operandos y operadores
y da como resultado un valor de un determinado tipo. |
Las expresiones booleanas se definen mediante los siguientes operadores:
- Operadores de comparación.
- Operadores booleanos o lógicos.
- Operadores de comparación.
- Los operadores de comparación permiten comparar dos valores. Estos valores dependen de los [tipos que tengan asignados](http://php.net/manual/es/language.types.type-juggling.php).
- Pueden verse las diferencias comparativas en la [tabla de comparación de tipos](http://php.net/manual/es/types.comparisons.php).
Ejemplo | Nombre | Resultado |
---|---|---|
$x == $y | Igual | true, si son iguales (adapta tipos, lo analizaremos). |
$x === $y | Idéntico | true, si son exactamente iguales (valor y tipo). |
$x != $y | Distinto | true, si son diferentes (adapta tipos, lo analizaremos). |
$x <> $y | Distinto | true, si son diferentes (adapta tipos, lo analizaremos). |
$x !== $y | No idéntico | true, si son diferentes (valor y tipo). |
$x < $y | Menor que | true, si $x es menor que $y. |
$x > $y | Mayor que | true, si $x es mayor que $y. |
$x <= $y | Menor o igual que | true, si $x es menor o igual que $y. |
$x >= $y | Mayor o igual que | true, si $x es mayor o igual que $y. |
(: PHP si comparo valores de diferentes tipo, va a realizar conversiones que veremos más adelante
- [conversión de string a números](http://php.net/manual/es/language.types.string.php#language.types.string.conversion).
)
- Operadores Lógicos
Los operadores lógicos permiten combinar expresiones booleanas para realizar evaluaciones más complejas.
Operador | Resultado |
---|---|
$x and $y | true si $x y $y son true. |
$x && $y | true si $x y $y son true. |
$x or $y | true si uno de los dos es true (o los dos). |
$x || $y | true si uno de los dos es true (o los dos). |
!$x | true si $x no es true (Es para negar algo=. |
$x xor $y | true si sólo uno de los dos es true (No muy usado).
|
Formularios
(: Los Formularios, constituyen un tema posterior
- Realizamos una introducción para tener más opciones a la hora de proponer ejercicios
- De esta forma podremos aportar valores por parte del usuario a la ejecución de los mismos
)
- Ejemplos
Programa que obtiene el valor absoluto de un número |
---|
$num = rand(-10, 20); if ($num < 0) { $num = -$num; } echo "El valor absoluto del número es $num"; }} |
- Ejercicios
- Realiza los siguientes ejercicios
If gráficamente (ordinagrama)
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)
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
`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`
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: Selección 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
Operador ternario |
---|
Programa para par o impar con operador ternario <?php $num = rand(1, 100); echo ($num % 2 == 0) ? "$num es par" : "$num es impar"; ?> |
Estructura if-else |
---|
Programa para par o impar con estructura if-else <?php $num = rand(1, 100); if ($num % 2 == 0) { echo "$num es par"; } else { echo "$num es 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.
Ejercicio 17(Con imágenes): Tirar un dado
Se trata de hacer un programa que apuestes por un dado El programa generará un valor aleatorio y me dirás si he ganado o perdido. Se puede usar un formulario como sigue: <form action="jugar.php" method="post"> <div style="margin: 0px auto;width:100%; text-align: center"> <button type="submit" name="dado" value="1"> <img src="./imagenes/dado_1.png" alt=""> </button> <button type="submit" name="dado" value="2"> <img src="./imagenes/dado_2.png" alt=""> </button> <button type="submit" name="dado" value="3"> <img src="./imagenes/dado_3.png" alt=""> </button> <button type="submit" name="dado" value="4"> <img src="./imagenes/dado_4.png" alt=""> </button> <button type="submit" name="dado" value="5"> <img src="./imagenes/dado_5.png" alt=""> </button> <button type="submit" name="dado" value="6"> <img src="./imagenes/dado_6.png" alt=""> </button> </form> Al ser lo button de tipo submit, al presionar uno de ellos iremos al fichero jugar.php y podremos obtener el valor del botón presionado $dado = $_POST['dado'];
|
}}
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
Ejemplo: Identificar un Nombre
| |||
|
Ejercicio 16: Selección con switch
- Genera un número de mes de forma aleatoria.
- Muestra el número de días que tiene el mes.
- Genera un mensaje informativo con el texto "El mes X tiene XXX días"
- Realiza usando `switch`:
(: Intenta que se muestre también el nombre del mes junto con el número de días )
$mes = rand(1, 15); switch ($mes) { case 1: $dias=31; break; case 2: $dias=29; break; // Continúa con los demás casos default: $dias = "Mes incorrecto<br />"; }
}}
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`.
Ejemplo: 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
- PHP en una comparación, adapta los tipos a comparar (si puede).
- Simpre que compare un entero con un booleano, convertirá el entero a booleano.
- En PHP, si especificamos expresiones booleanas dentro de un case, deberíamos de establecer también un booleano en 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; } ?>
- 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.
Posible Solución |
---|
<?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"; } ?> |
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 a la estructura switch-case
- A diferencia del switch-case, es un operador, y por lo tanto devuelve un valor.
- Su sintaxis
$variable = match($valor){ valor_rama_1 => valor_retornado_rama_1, valor_rama_2 => valor_retornado_rama_2, .... default => valor_retornado_si_ninguna_coincidencia_anterior };
$variable = match ($valor){ .... };
valor_rama_1 => valor_retornado_rama_1,
default => valor_retornado_si_ninguna_coincidencia_anterior
$variable = match ($valor){ .... };
|
|
- 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";
- Ejercicio
|